C# 当单个分部需要多个对象时,如何从视图向我的集合动态添加项?
我的视图中显示了一个项目列表。我需要能够通过添加按钮从UI手动将项目添加到此列表。我知道我需要用javascript加载一个局部视图来显示新项目C# 当单个分部需要多个对象时,如何从视图向我的集合动态添加项?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我的视图中显示了一个项目列表。我需要能够通过添加按钮从UI手动将项目添加到此列表。我知道我需要用javascript加载一个局部视图来显示新项目 @{var count = 0;} @foreach (var dx in Model.Patient.DxList) { <div class="form-field"> <label>@(++count)</label> @Html.HiddenFor(d =>
@{var count = 0;}
@foreach (var dx in Model.Patient.DxList)
{
<div class="form-field">
<label>@(++count)</label>
@Html.HiddenFor(d => dx.DxIndex)
@Html.TextBoxFor(d => dx.Dx, new { @class = "small" })
<span class="description">@((dx.DxRef != null) ? dx.DxRef.Title : "")</span>
@Html.DropDownListFor(d=> dx.Indicator, new SelectList(Model.Codes, "Value", "Description", dx.Indicator), "Please select", new { @class = "" })
</div>
}
不知道这是否是常规方法,或者我是否偏离了基准。您应该将一个项目的呈现分离到一个单独的局部视图/编辑器模板中,并在foreach循环中调用它,这样您就可以在一个地方定义一个项目的标记:
@foreach (var dx in Model.Patient.DxList)
{
@Html.EditorFor(m => dx)
}
然后,您的AddNewItem
操作可以返回一个只调用@Html.EditorForModel()
动态添加和删除行时,应将自己的索引(例如guid字符串)嵌入到项中以避免冲突。请看这篇伟大的文章,它解释了如何使用自定义html帮助器实现这一点:
您的EditorTemplate将如下所示:
@using (Html.BeginCollectionItem("DxList"))
{
@Html.TextBoxFor(d => dx.Dx, new { @class = "small" })
....
}
关于viewmodel是否应包含下拉列表的问题:viewmodel应包含渲染视图所需的所有数据。所以我想说是的,这是一个将列表传递给视图的好地方
当然,您也可以在viewbag中传递它,但我是强类型数据包的朋友,因此我更喜欢viewmodel。您可以尝试这种方法。 它有一个缺点,就是您必须记住属性的名称(路径),才能为自动绑定提供正确的输入名称(因此您无法使用重构工具轻松更改它) 查看
@foreach (int i=0;i < Model.Patient.DxList.Count;i++)
{
@{Html.RenderPartial("PartialDx", Model.Patient.DxList[i] ,new ViewDataDictionary() { {"count",i}});}
}
看起来是一个很好的简单解决方案。但是,是否确定此方法将为集合绑定呈现正确的输入名称(例如-Patient.DxList[0].DxIndex)?是的,它将呈现索引,但当您要动态添加和删除行时,应使用自己的索引。我会更新我的答案。很好。我不知道那个Html.BeginCollectionItem助手
@foreach (int i=0;i < Model.Patient.DxList.Count;i++)
{
@{Html.RenderPartial("PartialDx", Model.Patient.DxList[i] ,new ViewDataDictionary() { {"count",i}});}
}
@{string collectionName = string.Format("Patient.DxList[{0}].", ViewBag.count);}
<div class="form-field">
<label>@{ViewBag.count + 1}</label>
@Html.Hidden(collectionName+"Dx.DxIndex", Model.Dx.DxIndex)
</div>