Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当单个分部需要多个对象时,如何从视图向我的集合动态添加项?_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 当单个分部需要多个对象时,如何从视图向我的集合动态添加项?

C# 当单个分部需要多个对象时,如何从视图向我的集合动态添加项?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我的视图中显示了一个项目列表。我需要能够通过添加按钮从UI手动将项目添加到此列表。我知道我需要用javascript加载一个局部视图来显示新项目 @{var count = 0;} @foreach (var dx in Model.Patient.DxList) { <div class="form-field"> <label>@(++count)</label> @Html.HiddenFor(d =>

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

不知道这是否是常规方法,或者我是否偏离了基准。

您应该将一个项目的呈现分离到一个单独的局部视图/编辑器模板中,并在foreach循环中调用它,这样您就可以在一个地方定义一个项目的标记:

@foreach (var dx in Model.Patient.DxList)
{
    @Html.EditorFor(m => dx)
}
然后,您的
AddNewItem
操作可以返回一个只调用
@Html.EditorForModel()

动态添加和删除行时,应将自己的索引(例如guid字符串)嵌入到项中以避免冲突。请看这篇伟大的文章,它解释了如何使用自定义html帮助器实现这一点:

您的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}});}
}

看起来是一个很好的简单解决方案。但是,是否确定此方法将为集合绑定呈现正确的输入名称(例如-Patient.DxList[0].DxIndex)?是的,它将呈现索引,但当您要动态添加和删除行时,应使用自己的索引。我会更新我的答案。很好。我不知道那个Html.BeginCollectionItem助手
@foreach (int i=0;i < Model.Patient.DxList.Count;i++)
{
    @{Html.RenderPartial("PartialDx", Model.Patient.DxList[i] ,new ViewDataDictionary() { {"count",i}});}
}
@{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>