在Razor中引用复数可枚举

时间:2018-03-19 16:41:37

标签: c# asp.net-mvc

为什么MVC不能绑定我的复杂对象列表?我已经阅读了关于这个主题的几个examples,但没有解决这个问题。请考虑以下事项:

<小时/> 复杂版本

我有一个 ViewModel ,其中包含一个复杂对象列表作为属性:

public List<XMLVariable> XMLVariables { get; set; }

我的查看然后将此对象列表绑定到控件:

        @for (int i = 0; i < Model.XMLVariables.Count(); i++)
        {
            @Html.HiddenFor(m => Model.XMLVariables[i].Name)
            @Html.TextBoxFor(m => Model.XMLVariables[i].Value)
        }

视图显示变量就好了,但是当我提交表单时没有任何反应。不调用控制器操作。

<小时/> 展平版

如果我在同一 ViewModel 中展平我的复杂对象列表(XMLVariables):

     public List<string> Names { get; set; }
     public List<string> Values { get; set; }

并将其映射到我的查看

        @for (int i = 0; i < Model.XMLVariables.Count(); i++)
        {
            @Html.HiddenFor(m => Model.Names[i])
            @Html.TextBoxFor(m => Model.Values[i])
        }

提交后,两个列表都会以正确的值传回。

<小时/> 控制器动作:

    [HttpPost]
    public ActionResult Submit(ReportViewModel report, string cmd)
    { 
    }

表格签名:

@using (Ajax.BeginForm("Submit", "Report", new AjaxOptions {LoadingElementId = "progress", OnSuccess="OnSuccess", OnBegin="OnBegin", OnComplete="OnComplete" }))

1 个答案:

答案 0 :(得分:0)

问题在于我的“XMLVariable”对象。如果有人像我一样有问题绑定自定义对象,则看起来MVC从View中的数据构造 new ViewModel,而不是传回修改后的版本。

我出于某种原因没有收到错误,但MVC中的默认模型绑定器是从头开始创建XML对象并尝试调用我设置的参数化构造函数:

public class XMLVariable
{
    public string Name {get; set;}
    public string Value { get; set; }

    //MVC needed this parameterless constructor to bind View to new ViewModel
    public XMLVariable()
    { }

    //This was getting called before adding the parameterless constructor and failing
    public XMLVariable(string name, string value)
    {
        Name = name;
        Value = value;
    }
}

感谢ChetanRanpariya指出我遇到了这个问题的网络追踪工具。

如果某人有声誉,请将此标记为我在事后找到的this问题的副本。