2013-10-27 116 views
3

如何將dynamic數據通過AJAX調用傳遞給MVCController通過AJAX將動態數據傳遞給mvc控制器

Controller

public JsonResult ApplyFilters(dynamic filters){ 
    return null; 
} 

AJAX電話:

$(':checkbox').click(function (event) { 
    var serviceIds = $('input[type="checkbox"]:checked').map(function() { 
     return $(this).val(); 
    }).toArray(); 

    //alert(serviceIds); 

    $.ajax({ 
     type: 'GET', 
     url: '/home/ApplyFilters', 
     data: JSON.stringify({ 
      name: serviceIds 
     }), 
     contentType: 'application/json', 

     success: function (data) { 
      alert("succeeded"); 
     }, 
     error: function (err, data) { 
      alert("Error " + err.responseText); 
     } 
    }); 

    //return false; 
}); 

理想的是,該filters將包含serviceIds作爲屬性

例如像這樣:filters.ServiceIds。 我得到了一個日期範圍的另一個過濾器,那個會像這樣添加:filters.DateRange

和服務器端得到的過濾器作爲ApplyFilters()

+0

是什麼過濾器對象看,如果你的電話用AJAX的動作調用? – developer10214

+0

它看起來像這樣:{object}並且它不能被擴展 – Yustme

+0

在運行時計算'動態'對象,所以改變返回到'返回Json(過濾器)',這樣你就可以看到實際的數據 –

回答

7

廣告據我知道default ASP MVC模型綁定無法完成這樣的事情dynamic對象。

幸運的是有很多的解決方案,下面是其中的兩個:

Here是第一個,它將您的JSON數據轉換爲IDictionary<string, object>實例,然後將其傳遞給您的控制器操作。你最終會得到:

public JsonResult ApplyFilters(IDictionary<string, object> filters) 
{ 
    return null; 
} 

second approach使您的控制器操作能夠接收JsonValue實例。使你的動作看起來像這樣的:

public JsonResult ApplyFilters([DynamicJson]JsonValue filters) 
{ 
    return null; 
} 

。基於前面的教程,您可以創建自己的自定義模型綁定器,返回一個動態對象。以下代碼已從第一個提議中獲取並進行了修改以生成動態對象。這只是爲了說明這個想法,因爲是不使用它:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
    { 
     return null; 
    } 

    controllerContext.HttpContext.Request.InputStream.Position = 0; 
    using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream)) 
    { 
     var json = reader.ReadToEnd(); 
     if (string.IsNullOrEmpty(json)) 
     { 
      return null; 
     } 
     dynamic result = new ExpandoObject(); 
     var deserializedObject = new JavaScriptSerializer().DeserializeObject(json) as IDictionary<string, object>; 
     if (deserializedObject != null) 
     { 
      foreach (var item in deserializedObject) 
      { 
       ((IDictionary<string, object>)result).Add(item.Key, item.Value); 
      } 
     } 
     return result; 
    } 
} 

這些解決方案都需要建立一個自定義的模型綁定來處理這種particuliar場景:

  • 自定義模型綁定只是一個執行IModelBinder接口負責解析JSON發佈的數據並將它們轉換爲另一種格式。
  • ASP MVC框架,被告知通過註冊他們(與ModelBinders.Binders.Add或使用專用的屬性(CustomModelBinderAttribute)使用這些特定的自定義模型粘合劑。
+0

但我已經看到了這一點,正如我在另一個項目中所描述的那樣。所以我知道這是可能的100%! – Yustme

+0

但客戶端代碼是否需要代碼重構才能正常工作? – Yustme

+0

這些自定義模型綁定器正在期待並解析JSON。這正是你提供給服務器的任務「data:JSON.stringify({name:serviceIds})」。所以不需要客戶端代碼重構。 – AirL

相關問題