我想在我的脑海里做一个非常简单的事情但是当我试图创作时真的很复杂。在MVC ASP.NET环境中,我想创建一个模型但是多次渲染它。这是工作,但当我想要获取数据时,我什么都没有。 模型看起来像这样:
public class HardwareModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
...
}
包装器看起来像:
public class WrapperModel
{
public List<HardwareModel> HardwareList { get; set; }
public WrapperModel()
{
HardwareList = new List<HardwareModel>();
}
}
控制器:
readonly Hardware _hardware = new Hardware();
[Authorize]
public ActionResult Index()
{
return View(_hardware.GetHardwareList(int.Parse(Session["idEmployee"].ToString())));
}
[HttpPost]
[Authorize]
public ActionResult Index(WrapperModel model)
{
return View(model);
}
观点:
<% using (Html.BeginForm())
{%>
<% foreach (var hardware in Model.HardwareList)
{%>
<tr>
<td>
<div class="editor-label">
<%: Html.LabelFor(m => hardware.SelectedHardwareType) %>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(m => hardware.SelectedHardwareType, hardware.Hardwaretypes) %>
</div>
...
所以结果是这样的:
渲染正是我想要的,但问题是当我按下一个保存按钮时,使用控制器的第二部分,但“WrapperModel model”的值是一个空列表。在Request值中,我可以看到所有内容都发送到控制器但在WrapperModel中没有任何匹配。
我不知道该怎么办,因为“HardwareModel”的数量可以是0或99所以我无法创建HardwareModel1,HardwareModel2 ......就像我在网上阅读一样。
感谢您帮助我,并为长篇文章感到抱歉。
答案 0 :(得分:2)
使用 EditorTemplate ,您会很好。
创建一个名为 EditorTemplates 的文件夹,并使用名称创建一个视图(editortemplate) HardwareModel.cshtml
现在将以下代码添加到编辑器模板(新视图)。您可以根据您的要求更新布局。
@model HardwareModel
<p>
Name @Html.TextBoxFor(x => x.Name) <br />
Desc : @Html.TextBoxFor(x => x.Description)
@Html.HiddenFor(x => x.Id)
</p>
现在在主视图中,使用Html.EditorFor
HTML帮助程序方法调用此编辑器模板。
@model WrapperModel
@using (Html.BeginForm())
{
@Html.EditorFor(x=>x.HardwareList)
<input type="submit" value="Save" />
}
假设你有GET Action向这个视图发送一个HardwareModel列表
public ActionResult Hardware()
{
WrapperModel model = new WrapperModel();
//HardCoded for demo.Can be replaced with entries based on your DB data
model.HardwareList.Add(new HardwareModel { Id=1, Name = "Printer",
Description = "desc" });
model.HardwareList.Add(new HardwareModel { Id=2, Name = "Scanner",
Description = " desc2" });
return View(model);
}
现在,您的HttpPost操作方法将在表单提交
上获取子属性[HttpPost]
public ActionResult Hardware(WrapperModel model)
{
//check for model.HardwareList Property here;
return View(model);
}
Here您可以下载我编写的工作样本来解决您的问题。
答案 1 :(得分:1)
这是我在这个问题上读过的最好的文章。我希望它有所帮助:DotNetSlackers - Understanding ASP.NET MVC Model Binding
具体而言,您可能会对Binding with a list of class types
部分感兴趣