繁体   English   中英

如果单个部分需要多个对象,如何从视图中动态添加项目到我的集合?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM