[英]ASP.NET MVC: How to create a model that will bind to this POSTed data?
我在創建將綁定到下面的表單數據的模型時遇到了麻煩。 我遇到的主要困難是創建一個將綁定filter
的模型(即:多維數組)。
到目前為止,這就是我所擁有的。 誰能幫助我使此模型正確綁定?
public class GetPagedRequest
{
public int Start { set; get; }
public int Limit { set; get; }
public string dir { set; get; }
public List<FilterRequest> filter { set; get; } //This won't bind properly
}
public class FilterRequest
{
public string field { set; get; }
public DataFilterRequest data { set; get; }
}
public class DataFilterRequest
{
public string type { set; get; }
public string value { set; get; }
}
閱讀了DefaultModelBinder的功能后,我在發布數據中看到了問題。
在進行任何操作之前,只需將filter屬性的類更改為:
public IList<FilterRequest> filter { set; get; } //(IList<T> instead of List<T>)
這是DefaultModelBinder將正確綁定的查詢字符串:
start=0&limit=5&dir=ASC&sort=noSort&filter[0].field=CompanyName&filter[0].data.type=string&filter[0].data.value=Telus&filter[1].field=VendorName&filter[1].data.type=string&filter[1].data.value=testtest
但是js正在生成此查詢字符串:
start=0&limit=5&dir=ASC&sort=noSort&filter[0][field]=CompanyName&filter[0][data][type]=string&filter[0][data][value]=Telus&filter[1][field]=VendorName&filter[1][data][type]=string&filter[1][data][value]=testtest
現在您可以實現自己的ModelBinder類,但是我認為在客戶端上序列化對象會更容易,只需確保正確設置內容類型即可。 這是在jquery中制作的一個示例:
<script type="text/javascript">
$(function () {
$("#btnSendPost").click(function () {
var filterData = {
"start": 0, "limit": 5,
"dir": "ASC", "sort": "noSort",
"filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
{ "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
$.ajax({
type: "POST",
url: "/Home/ReceivePostFromJson",
data: JSON.stringify(filterData),
dataType: "json",
contentType: 'application/json; charset=utf-8'
});
});
});
</script>
然后,僅將此行添加到global.asax文件中的Application_Start方法中:
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
這樣,框架將正確地綁定模型,並且在action方法中,您將收到對象
[HttpPost]
public ActionResult ReceivePostFromJson(GetPagedRequest g)
{
如果可以在發布過濾器數據之前從控件中對JSON進行字符串化處理,則可以使用JavaScriptSerializer對對象進行反序列化。
這個例子是用jquery制作的:
<script type="text/javascript">
$(function () {
$("#btnSendPost").click(function () {
var filterData = {
"start": 0, "limit": 5,
"dir": "ASC", "sort": "VendorName",
"filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
{ "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
$.ajax({
type: "POST",
url: "/Home/ReceivePostFromJson",
data: JSON.stringify(filterData),
dataType: "application/json"
});
});
});
</script>
然后在控制器中:
[HttpPost]
public ActionResult ReceivePostFromJson()
{
string jsonStringify = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
var obj = new JavaScriptSerializer().Deserialize<GetPagedRequest>(jsonStringify);
return View(obj);
}
這樣,您就有了嵌套的對象:
注意:在此示例中,如果刪除函數JSON.stringify (數據:filterData,),則將在控制器端看到產生問題的查詢字符串(filter [0] [field]:CompanyName)。 我不知道是否有恢復json的方法,如果可能的話,則不必修改網格控件:
我不支持jherrera的解決方案:
[HttpPost]
public ActionResult ReceivePostFromJson()
{
string jsonStringify = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
var obj = new JavaScriptSerializer().Deserialize<GetPagedRequest>(jsonStringify);
return View(obj);
}
如果要從服務器端的客戶端接收json數據,則應准備客戶端對象以具有類似於服務器端viewmodel的保存結構。 這樣,當提交表單時,模型聯編程序將完美地完成其工作。
代碼未經測試:
public ActionResult DeleteXXX(GetPagedRequest pagedRequestViewModel)
{
// Use AutoMapper or a UI Service to reshape/map your viewmodel to your domain model
return EmptyResult();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.