2011-02-12 29 views
12

kullanarak bir denetleyiciye parametre aktarımı Bir görünüm ve denetleyici oluşturdum, denetleyici bazı arama sonuçlarını döndürmek istiyorum. My kontrolör Sorunum denetleyicisi içine benim jquery çağrısından varible dile nasıl emin değilim buJQuery ajax

[HttpPost] 
    public ActionResult Search(string input) 
    { 
     var result = _db.Ingredients.Where(i => i.IngredientName == input); 

     return new JsonResult() {Data = new {name="Hello There"}}; 
    } 

benziyor

<input type="text" id="caption" /> 
     <a href="#" id="search">Search</a> 
     <script> 
      $("#search").click(function() { 
       alert('called'); 
       var p = { Data: $('#search').val() }; 
       $.ajax({ 
        url: '/Ingredients/Search', 
        type: "POST", 
        data: JSON.stringify(p), 
        dataType: "json", 
        contentType: "application/json; charset=utf-8", 
        success: function (data) { 
         alert(data); 
        }, 
        error: function() { 
         alert("error"); 
        } 
       }); 
      }); 

, ben koydum jquery kullanarak kontrolörü arıyorum kontrolördeki kesme noktası ve bununla ilgili olarak vuruldu ancak giriş dizgisi her zaman boştur.

Neyi yanlış yaptım?

cevap

19
<input type="text" id="caption" /> 
@Html.ActionLink("Search", "Search", "Ingredients", null, new { id = "search" }) 

ve sonra sedasız AJAXify ayrı javascript dosyasında bu linki:

[HttpPost] 
public ActionResult Search(string input) 
{ 
    var result = _db.Ingredients.Where(i => i.IngredientName == input); 
    // TODO: Use the result variable in the anonymous object 
    // that is sent as JSON to the client 
    return Json(new { name = "Hello There" }); 
} 
+1

Doğru. Açıklamak gerekirse: C# 'daki değişkeniniz ve kullandığınız JSON öğesinde kullanılan alan aynı ada sahipse, otomatik olarak birbirleriyle bağlanırlar. JSON özelliğini "{captionvalue: $ ('# caption'). Val()}' olarak değiştirirseniz, işlevinizdeki değişkeni "captionvalue" olarak yeniden adlandırmanız gerekir. Sadece bir açıklama bu yüzden neden bu :-) çalıştığını anlıyorsunuz – Flater

0

Sorun, DefaultModelBinder'ın çalışması için, parametrenin ada göre eşleşmesi gerektiğidir. Eylem parametrenizin adını, varsayılan rotanızda "id" adıyla, varsayılan olarak "id" olarak değiştirebilir, sonra bunu yapabilirsiniz;

 $("#search").click(function() { 
      alert('called'); 
      var url = '/Ingredients/Search/' + $('#search').val(); 
      $.ajax({ 
       url: url, 
       type: "POST", 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        alert(data); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }); 
     }); 

Veya, kendinizi sunucu tarafında eşleştirilir bir şekilde bunu inşa etmek Json dize yazabilirsiniz;

 $("#search").click(function() { 
      alert('called'); 
      var p = { "input": $('#search').val() }; 
      $.ajax({ 
       url: '/Ingredients/Search', 
       type: "POST", 
       data: p, 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        alert(data); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }); 
     }); 

Bu denenmemiş ama çalışması gerekir.

+0

Merhaba David, kullanın Denedim olduğunu ancak herhangi bir şans. Denetleyicileri paramater olarak güncelleştirdim, ancak hala boş olarak döndürülüyor. Başka tavsiye var mı? –

+0

Maalesef, altyazı metin kutusu yerine arama köprüsündeki değeri kullandığımı fark ettim. Bu yüzden $ ("search") satırını $ ("caption") ile değiştirmeyi deneyin. Val() – davidferguson

+0

Cool Teşekkür ederim David –

2

Yolu buradadır: Denetleyiciniz eylem gibi görünebilir

$(function() { 
    $("#search").click(function() { 
     $.ajax({ 
      url: this.href, 
      type: 'POST', 
      data: { input: $('#caption').val() }, 
      success: function (result) { 
       alert(result.name); 
      }, 
      error: function() { 
       alert("error"); 
      } 
     }); 
     return false; 
    }); 
}); 

. Eğer

dataType belirtmek istiyorum

: 'json'

Sonra kullanın

$('#ddlIssueType').change(function() { 


      var dataResponse = { itemTypeId: $('#ddlItemType').val(), transactionType: this.value }; 

      $.ajax({ 
       type: 'POST', 
       url: '@Url.Action("StoreLocationList", "../InventoryDailyTransaction")', 
       data: { 'itemTypeId': $('#ddlItemType').val(), 'transactionType': this.value }, 
       dataType: 'json', 
       cache: false, 
       success: function (data) { 
        $('#ddlStoreLocation').get(0).options.length = 0; 
        $('#ddlStoreLocation').get(0).options[0] = new Option('--Select--', ''); 

        $.map(data, function (item) { 
         $('#ddlStoreLocation').get(0).options[$('#ddlStoreLocation').get(0).options.length] = new Option(item.Display, item.Value); 
        }); 
       }, 
       error: function() { 
        alert("Connection Failed. Please Try Again"); 
       } 
      }); 

Eğer

dataType belirtmezseniz: 'json '

'Json' ve contentType:

Sonra

dataType belirtmek istiyorum

$('#ddlItemType').change(function() { 

     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("IssueTypeList", "SalesDept")', 
      data: { itemTypeId: this.value }, 
      cache: false, 
      success: function (data) { 
       $('#ddlIssueType').get(0).options.length = 0; 
       $('#ddlIssueType').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlIssueType').get(0).options[$('#ddlIssueType').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again"); 
      } 
     }); 

kullanmak 'application/json; charset = utf-8'

Sonra

$.ajax({ 
      type: 'POST', 
      url: '@Url.Action("LoadAvailableSerialForItem", "../InventoryDailyTransaction")', 
      data: "{'itemCode':'" + itemCode + "','storeLocation':'" + storeLocation + "'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
      cache: false, 
      success: function (data) { 

       $('#ddlAvailAbleItemSerials').get(0).options.length = 0; 
       $('#ddlAvailAbleItemSerials').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlAvailAbleItemSerials').get(0).options[$('#ddlAvailAbleItemSerials').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again."); 
      } 
     });