【问题标题】:How to post a complex model to action?如何将复杂的模型发布到行动中?
【发布时间】:2013-02-28 03:34:53
【问题描述】:

我的模型定义:

public class RulePageViewModel
{
    public List<RuleItem> RuleItemList { get; set; }

    public RuleViewModel RuleViewModel { get; set; }
}

我的动作已定义:

public JsonResult Save(RulePageViewModel viewmodel)

我尝试发布 json,viewmodel.RuleItemList.Count > 0,但 viewmodel.RuleItemList 中的实例为空。 如果使用模型绑定,如何在视图中绑定列表?

我没有尝试绑定模型,只是使用 ajax 将 json 发布到操作。我认为它会工作,但失败的代码:

var s = { "RuleItemList": [{ "RuleGroupId": 1, "RuleGroupName": "", "Keywords": "ajax", "ResponseDescribe": "dadhsa" }], "RuleViewModel": { "RuleGroupId": 14, "RuleList": [{ "RuleId": 567, "SourceId": 125, "KeyValue": "callback", "SourceType": 0 }], "SourceList": [] } };
var ss = JSON.stringify(s);
var json = JSON.parse(ss);
$.ajax({
    url: '@Url.Action("Save")',
    type: 'POST',
    data: json,
    dataType: 'json',
    success: function(response) {
        alert('success');
    },
    error: function(jqXHR, textStatus, errorThrown) {
        alert(textStatus);
    }
});

好的,我解决了:

var json = { "RuleItemList": [{ "RuleGroupId": 1, "RuleGroupName": "", "Keywords": "ajax", "ResponseDescribe": "dadhsa" }], "RuleViewModel": { "RuleGroupId": 14, "RuleList": [{ "RuleId": 567, "SourceId": 125, "KeyValue": "callback", "SourceType": 0 }], "SourceList": [] } };

$.ajax({
    url: '@Url.Action("Save")',
    type: 'POST',
    data: JSON.stringify(json),
    dataType: 'json',
    contentType: 'application/json',
    success: function(response) {
        alert('success');
    },
    error: function(jqXHR, textStatus, errorThrown) {
        alert(textStatus);
    }
});

谢谢大家!

【问题讨论】:

  • 添加您的查看代码...
  • 是的,添加您的查看代码。这是可能的,但模型绑定器必须能够根据请求重建模型。
  • Model Binding to a List上有一个很好的帖子

标签: c# .net ajax asp.net-mvc


【解决方案1】:

通常你应该这样做:

    @for(var i = 0;i<Model.RuleItemList.Count;++i)
    {
        @Html.TextBoxFor(m => m.RuleItemList[i].Name);
    }

    @Html.EditorFor(m = > m.RuleViewModel.PropertyOne);
    @Html.EditorFor(m = > m.RuleViewModel.PropertyTow);
    @Html.EditorFor(m = > m.RuleViewModel.PropertyThree);

最终会在 html 中生成类似的内容:

<input type="text" name="RuleViewModel.PropertyOne" value="" />
<input type="text" name="RuleViewModel.PropertyTow" value="" />
<input type="text" name="RuleViewModel.PropertyThree" value="" />

现在,因为您没有放置任何查看代码或来自 RuleItemRuleViewModel 类的任何代码,这将成为专门回答您的问题的问题,所以请发布更多信息,但总的来说,您应该了解什么我在这里写了如何实现这样的 from 将数据发布到您的控制器操作,以便Model Binder 知道要绑定哪些属性..

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多