【问题标题】:Referencing Complex Enumerable in Razor [duplicate]在 Razor 中引用复杂枚举
【发布时间】:2018-03-19 16:41:37
【问题描述】:

为什么 MVC 不能绑定 my 复杂对象列表?我已经阅读了几个关于这个主题的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" }))

【问题讨论】:

  • 您需要共享后控制器操作的代码,并告诉我们您在提交表单时会得到什么
  • @ChetanRanpariya "视图显示变量很好,但是当我提交表单时没有任何反应。没有调用控制器操作。"
  • 是的,我认为这不是控制器操作的问题,但我已将其包含在内。
  • 当我提交表单时没有任何反应 - 这个神秘表单的定义在哪里?它不提交是因为它不存在,还是您只是碰巧忽略了代码中最重要的部分?
  • @BrandonChurch 让你的代码“完整”到足以解决问题的最佳方法是提供一个完整的控制器类、视图文件和模型。这意味着将您的控制器减少到 2 个操作,GETPOST。将您的模型缩减为仅显示问题所需的部分。使用提交按钮和适当的输入代码将视图缩小为表单标签。这样我就可以真正创建一个新项目,将你的 3 个文件复制粘贴到那里,点击运行并查看问题发生(即 MCVE)。然后我们可以努力找出它发生的原因。

标签: c# asp.net-mvc


【解决方案1】:

问题出在我的“XMLVariable”对象上。如果有人像我一样在绑定自定义对象时遇到问题,似乎 MVC 从视图中的数据构造了一个 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 问题的重复。

【讨论】:

  • 按要求复制。但是您在这里还有另一个问题,因为您有一个隐藏的输入和一个用于同一属性的文本框。 DefaultModelBinder 将绑定第一个匹配的名称/值对并忽略第二个,因此您的模型将绑定到其原始值(即隐藏输入中的值)
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多