[英]How to dynamically add items to my collection from a view when single partial requires multiple objects?
我有一个在我的视图中显示的项目列表。 我需要能够通过添加按钮从UI手动添加项目到此列表。 我知道我需要使用javascript加载局部视图以显示新项目。
@{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(使用代码填充),我的部分视图是否也需要ViewModel? 不仅要包含Dx,还要包含创建列表的相应代码列表?
public class DxSingleViewModel
{
public Dx Dx { get; set; }
public List<Code> Codes { get; set; }
}
不知道这是否是一般方法,或者我是否偏离基础。
你应该将一个项目的渲染分离到一个单独的局部视图/编辑器模板,并在foreach循环中调用它,这样你就可以在一个地方定义一个项目的标记:
@foreach (var dx in Model.Patient.DxList)
{
@Html.EditorFor(m => dx)
}
然后你的AddNewItem
动作可以返回一个只调用@Html.EditorForModel()
的局部视图
在动态添加和删除行时,您应该将自己的索引(例如guid字符串)嵌入到项目中以避免冲突。 看一下这篇很棒的文章,它解释了如何使用自定义的html帮助程序来实现它: http : //blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2 -样式/
您的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}});}
}
PartialView - 类型为DxSingleViewModel
强类型局部视图
@{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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.