我有一个项目列表显示在我的 View 中。我需要能够使用添加按钮从 UI 手动将项目添加到此列表。我知道我需要使用 javascript 加载局部 View 才能显示新项目。
@{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>
}
但是,因为我的项目同时包含一个 TextBox 和一个用代码填充的 DropDownList,我的局部 View 是否也需要一个 ViewModel?不仅包含 Dx,还包含创建列表的适当代码列表?
public class DxSingleViewModel
{
public Dx Dx { get; set; }
public List<Code> Codes { get; set; }
}
不知道这是否是一般方法,或者我是否偏离了基地。
最佳答案
您应该将一个项目的呈现分离到一个单独的局部 View /编辑器模板,并在您的 foreach 循环中调用它,这样您就只有一个地方可以为一个项目定义标记:
@foreach (var dx in Model.Patient.DxList)
{
@Html.EditorFor(m => dx)
}
然后您的 AddNewItem
操作可以返回一个局部 View ,该 View 仅调用 @Html.EditorForModel()
动态添加和删除行时,您应该将自己的索引(例如 guid 字符串)嵌入到项目中以避免冲突。看看这篇很棒的文章,它解释了如何使用自定义 html 帮助程序实现这一点:http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
您的 EditorTemplate 将如下所示:
@using (Html.BeginCollectionItem("DxList"))
{
@Html.TextBoxFor(d => dx.Dx, new { @class = "small" })
....
}
关于 View 模型是否应包含下拉列表的问题: View 模型应包含呈现 View 所需的所有数据。所以我会说是的,这是将列表传递给 View 的好地方。
因为你也可以在 viewbag 中传递它,但我是强类型数据包的 friend ,所以我更喜欢 viewmodel。
关于c# - 当单个部分需要多个对象时,如何从 View 中动态地将项目添加到我的集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456265/