【问题标题】:Collection data not appearing in models after being posted. (Includes collections of collections.)集合数据在发布后未出现在模型中。 (包括集合的集合。)
【发布时间】:2023-03-13 05:30:01
【问题描述】:

我有一个 PersonEditorModel,其中包含我希望在编辑器中表示的人员列表。我有一组 Person 对象,其中包含一组 Address 对象。我想为所有这些呈现文本框,以便用户可以编辑与这些名称关联的名称和地址。

class PersonEditorModel 
{
    public List<Person> People;
}

class Person 
{
    public string Name;
    public List<Address> Addresses;
}

class Address
{
    public string Value;
}

我正在生成一个用于编辑地址和与其关联的名称的表单。它使用 Ajax.BeginForm 因为这是一个简化的示例,源自我在一个更大的应用程序中遇到的问题,其中表单使用 Ajax 更新页面的不同部分以获得结果。

在基本表单的cshtml中:

@model Models.PersonEditorModel
@using (Ajax.BeginForm("Update", new AjaxOptions { HttpMethod = "Post" }))
{
    <div>
        @Html.EditorFor(x => x.People)
        <button type="submit">Commit Changes</button>
    </div>
}

Person.cshtml:

@model Models.Person
<div> @Html.TextBoxFor(x => x.Name) </div>
<div> @Html.EditorFor(x => x.Addresses) </div>

地址.cshtml:

@model Models.Address
<div> @Html.TextBoxFor(x => x.Value) </div>

控制器的动作方法:

public ActionResult Update(List<Person> people) { /* snip */ }

当我提交此表单时,立即在 Update() 中放置一个断点显示“人员”是一个长度正确的列表,但它绝对不包含任何数据——所有地址都是空字符串,即使表单数据为出现在 Request.Form 看起来是正确的。

什么可能导致这样的问题,以及解决这个问题的惯用 MVC 方法是什么?

注意:这是我在更复杂的应用程序中看到的一些行为的简化示例。我想我已经抓住了问题的本质,但可能还有其他一些未知的复杂因素。让我知道什么可能会使这复杂化导致我看到的问题,我会尽力提供我能提供的任何其他细节。

我已尝试让 Update 采用 PersonEditorModel 参数,但绝对没有任何数据。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller


    【解决方案1】:
    class Address
    {
        public string Value;
    }
    

    应该是:

    class Address
    {
        public string Value { get; set; }
    }
    

    默认模型绑定器适用于属性,而不是字段。

    还要确保生成的输入字段名称尊重standard convention

    【讨论】:

    • 完美运行。由于我总是在使用没有特殊 get 或 set 逻辑的属性时使用字段,所以我在心里将属性与默认 get 和 set 与公共字段混为一谈。这个假设让我在精神上跳过了关于模型绑定的信息谈论属性而不是字段的事实。我经常使用字段的做法可能是我应该纠正的不好的做法。
    【解决方案2】:

    在我看来,您在这里至少有两个问题,都是与模型相关的。首先是发布到您的调用的对象是根据生成表单中输入元素的 ID 自动构建的。例如,要提取一个名为 PersonName 的属性,就需要在某处有一个类似于

    的标记
    <input type='whatever' id='PersonName' />
    

    因此,这些属性必须能够通过这样的输入来表示。

    第二个问题源于第一个问题。使用 MVC 内置的 ajax 表单(与一般的 AJAX(和在 jQuery 中)相比,它是有限的),没有办法(至少我知道)定义任何集合,但尤其是不像列表那样通用的东西。要使用 MVC 的 AJAX 执行此操作,您可能需要一次为一个人/用户实现一个编辑器,并提交传回的数据(带有单个或枚举数量的地址)。

    此外,您可能需要重新考虑通过一次 AJAX 调用更新一组人员。 AJAX 的动态特性更适合于更小、更频繁的更新。

    【讨论】:

    • 我没有这些问题。这是一个简化的示例,它不能证明使用 AJAX 是合理的,但我将它包含在我的简化示例中,因为我认为它可能对手头的问题有一些影响。通过使用 @Html.TextBoxFor(x => x.Thing) 已经为我生成了输入,所以如果生成错误,那将是 TextBoxFor/EditorFor 的问题,而不是我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多