我有一个基本的ViewModel,其属性是一个复杂类型的List.绑定时,我似乎不知道要么获取值列表,要么根据发布的值(即视图排列)获取其他模型属性.
视图模型:
public class MyViewModel
{
public int Id { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
public List<MyDataItem> Data { get; set; }
}
public class MyDataItem
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器动作:
public ActionResult MyForm()
{
MyViewModel model = new MyViewModel();
model.Id = 1;
model.Data = new List<MyDataItem>()
{
new MyDataItem{ Id = 1, ParentId = 1, Name = "MyListItem1", Value = "SomeValue"}
};
return View(model);
}
[HttpPost]
public ActionResult MyForm(MyViewModel model)
{
//...
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
这是基本视图(没有列表标记)
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>My View Model</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.Property1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Property1)
@Html.ValidationMessageFor(model => model.Property1)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Property2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Property2)
@Html.ValidationMessageFor(model => model.Property2)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
Run Code Online (Sandbox Code Playgroud)
当回发到控制器时,我得到了2个属性值和'Data'属性的null值.

如果我按如下方式为List添加标记(根据Scott Hanselman帖子和Phil Haack的帖子中的信息):
<div class="editor-field">
@for (int i = 0; i < Model.Data.Count(); i++)
{
MyDataItem data = Model.Data[i];
@Html.Hidden("model.Data[" + i + "].Id", data.Id)
@Html.Hidden("model.Data[" + i + "].ParentId", data.ParentId)
@Html.Hidden("model.Data[" + i + "].Name", data.Name)
@Html.TextBox("model.Data[" + i + "].Value", data.Value)
}
</div>
Run Code Online (Sandbox Code Playgroud)
模型的"Data"属性已成功绑定,但其他属性为null.

发布的表单值如下:
Id=1&Property1=test1&Property2=test2&model.Data%5B0%5D.Id=1&model.Data%5B0%5D.ParentId=1&model.Data%5B0%5D.Name=MyListItem1&model.Data%5B0%5D.Value=SomeValue
Run Code Online (Sandbox Code Playgroud)
有没有办法让两组属性都填充,或者我只是遗漏了一些明显的东西?
编辑:
对于那些好奇的人.根据MartinHN的回答,原始生成的加价是:
<div class="editor-field">
<input id="model_Data_0__Id" name="model.Data[0].Id" type="hidden" value="1" />
<input id="model_Data_0__ParentId" name="model.Data[0].ParentId" type="hidden" value="1" />
<input id="model_Data_0__Name" name="model.Data[0].Name" type="hidden" value="MyListItem1" />
<input id="model_Data_0__Value" name="model.Data[0].Value" type="text" value="SomeValue" />
</div>
Run Code Online (Sandbox Code Playgroud)
新生成的加价是:
<div class="editor-field">
<input id="Data_0__Id" data-val="true" name="Data[0].Id" type="hidden" value="1" data-val-number="The field Id must be a number." data-val-required="The Id field is required." />
<input id="Data_0__ParentId" name="Data[0].ParentId" type="hidden" value="1" data-val="true" data-val-number="The field ParentId must be a number." data-val-required="The ParentId field is required." />
<input id="Data_0__Name" name="Data[0].Name" type="hidden" value="MyListItem1" />
<input id="Data_0__Value" name="Data[0].Value" type="text" value="SomeValue" />
</div>
Run Code Online (Sandbox Code Playgroud)
这导致以下发布值:
Id=1&Property1=test1&Property2=test2&Data%5B0%5D.Id=1&Data%5B0%5D.ParentId=1&Data%5B0%5D.Name=MyListItem1&Data%5B0%5D.Value=SomeValue
Run Code Online (Sandbox Code Playgroud)
请注意,没有'模型'.在名称和发布值...
Mar*_*nHN 34
尝试将Data集合的代码更改为此,让MVC负责命名:
<div class="editor-field">
@for (int i = 0; i < Model.Data.Count(); i++)
{
@Html.HiddenFor(m => m.Data[i].Id)
@Html.HiddenFor(m => m.Data[i].ParentId)
@Html.HiddenFor(m => m.Data[i].Name)
@Html.TextBoxFor(m => m.Data[i].Value)
}
</div>
Run Code Online (Sandbox Code Playgroud)
Ε Г*_*И О 12
或者,您可以EditorTemplate为嵌套的ViewModel 创建一个,如下所示.
@model MyDataItem
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.ParentId)
@Html.HiddenFor(model => model.Name)
@Html.TextBoxFor(model => model.Value)
Run Code Online (Sandbox Code Playgroud)
在"共享"文件夹中创建名为"EditorTemplates"的文件夹,并将上面的内容另存为"MyDataItem.cshtml".
然后在您的视图中,只需调用以下代码而不是foreach循环:
@Html.EditorFor(model => model.Data)
Run Code Online (Sandbox Code Playgroud)
感觉有点不太讨厌IMO :)
只是我的2美分,但值得注意的是这个问题 - 视图模型中的数据成员必须被定义为回发模型绑定工作的公共属性.我遇到了与上面类似的问题,但在我的View Model中使用了一个公共数据成员.如上所示生成相同的HTML并且所有看起来都很好,但模型绑定器会抛回一个空集合.值得关注......
| 归档时间: |
|
| 查看次数: |
31189 次 |
| 最近记录: |