c# - 当单个部分需要多个对象时,如何从 View 中动态地将项目添加到我的集合中?

标签 c# asp.net asp.net-mvc asp.net-mvc-3

我有一个项目列表显示在我的 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/

相关文章:

c# - 仅返回类型不同的 C++ 多个接口(interface)?

c# - C# 向字典中添加数据

java - 如何在java中使用与c#中相同的split方法

c# - 消息框 asp.net c#

Javascript 在返回值中保留\f

c# - 传入字典的模型项是 '' 类型的,但是这个字典需要一个 '' 类型的模型项

asp.net-mvc - MVC : Repositories and Services

c# - 从 Controller 返回局部 View ?

c# - 是否有将模型转换为 View 模型的快捷方式?

c# - 找不到方法 : 'Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(Boolean)'