5

我的视图中显示了一个项目列表。我需要能够使用添加按钮从 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; }
}

不知道这是否是一般方法,或者我是否不在基地。

4

2 回答 2

2

您应该将一项的呈现分离到一个单独的局部视图/编辑器模板并在您的 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" })
    ....
}

关于视图模型是否应包含下拉列表的问题:视图模型应包含渲染视图所需的所有数据。所以我会说是的,这是将列表传递给视图的好地方。

当然你也可以在视图包中传递它,但我是强类型数据包的朋友,所以我更喜欢视图模型。

于 2012-11-19T15:08:34.983 回答
0

你可以试试这个方法。它有一个缺点,您必须记住属性的名称(路径)才能呈现正确的输入名称以进行自动绑定(因此您无法使用重构工具轻松更改它)。

看法

@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>
于 2012-11-19T22:53:19.887 回答