Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发布后,收集数据未出现在模型中。(包括集合的集合。)_C#_Asp.net Mvc_Asp.net Mvc 3_Model View Controller - Fatal编程技术网

C# 发布后,收集数据未出现在模型中。(包括集合的集合。)

C# 发布后,收集数据未出现在模型中。(包括集合的集合。),c#,asp.net-mvc,asp.net-mvc-3,model-view-controller,C#,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,我有一个PersonEditorModel,其中包含我希望在编辑器中表示的人员列表。我有一组Person对象,其中包含一组Address对象。我想呈现所有这些名称的文本框,以便用户可以编辑与这些名称关联的名称和地址 class PersonEditorModel { public List<Person> People; } class Person { public string Name; public List<Address> Add

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

class PersonEditorModel 
{
    public List<Person> People;
}

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

class Address
{
    public string Value;
}
class PersonEditorModel
{
公众人物名单;
}
班主任
{
公共字符串名称;
公开名单地址;
}
班级地址
{
公共字符串值;
}
我正在生成一个表单,用于编辑地址和与之关联的名称。它使用的是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>
}
@model Models.PersonEditorModel
@使用(Ajax.BeginForm(“更新”,新的AjaxOptions{HttpMethod=“Post”}))
{
@EditorFor(x=>x.People)
提交更改
}
Person.cshtml:

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

@model Models.Address
<div> @Html.TextBoxFor(x => x.Value) </div>
@model Models.Address
@Html.TextBoxFor(x=>x.Value)
控制器的操作方法:

public ActionResult Update(List<Person> people) { /* snip */ }
公共行动结果更新(列出人员){/*snip*/}
当我提交此表单时,Update()中立即放置的断点显示“people”是一个长度正确的列表,但它绝对不包含任何数据——所有地址都是空字符串,即使Request.form中显示的表单数据看起来是正确的

是什么导致了这样的问题?解决这个问题的惯用MVC方法是什么

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

我试着让Update改为使用PersonEditorModel参数,但这绝对不会得到任何数据

class Address
{
    public string Value;
}
应该是:

class Address
{
    public string Value { get; set; }
}
默认模型绑定器使用的是属性,而不是字段

另外,请确保生成的输入字段名称符合

应该是:

class Address
{
    public string Value { get; set; }
}
默认模型绑定器使用的是属性,而不是字段


另外,请确保生成的输入字段名称符合。

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

<input type='whatever' id='PersonName' />

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

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


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

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

<input type='whatever' id='PersonName' />

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

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


此外,您可能需要重新考虑通过一个AJAX调用更新一整套人员。AJAX的动态特性使其能够更好地进行更小、更频繁的更新。

非常有效。因为我总是在使用没有特殊get或set逻辑的属性时使用字段,所以我在心里将属性与默认get和set以及公共字段合并。这个假设让我在思想上忽略了一个事实,即关于模型绑定的信息谈论的是属性,而不是字段。我经常使用字段的做法可能不好,我应该纠正。效果很好。因为我总是在使用没有特殊get或set逻辑的属性时使用字段,所以我在心里将属性与默认get和set以及公共字段合并。这个假设让我在思想上忽略了一个事实,即关于模型绑定的信息谈论的是属性,而不是字段。我经常使用字段的做法可能不好,我应该纠正。我没有这些问题。这是一个简化的示例,并不证明使用AJAX是合理的,但我将其包括在简化的示例中,因为我认为它可能与当前的问题有一定关系。已经通过使用@Html.TextBoxFor(x=>x.Thing)为我生成了输入,因此如果生成错误,则是TextBoxFor/EditorFor的问题,而不是我的问题。我没有这两个问题。这是一个简化的示例,并不证明使用AJAX是合理的,但我将其包含在我的