【问题标题】:Using an array to populate multiple fields with MVC/C#使用数组使用 MVC/C# 填充多个字段
【发布时间】:2015-06-05 10:28:18
【问题描述】:

通过网站搜索,我看到了这个问题的很多变体,但没有一个与这个特殊情况有关。

我正在尝试使用在我的模型中保存字符串的数组中的值index i 填充多个 DropDownLists。

我的模板与以下类似(简化):

@model foo

@for (int i = 0; i < Model.ArrayName.Length; i++ )
{
     @Html.LabelFor(m => m.ArrayName[i], "Index " + i, new {})
     @Html.DropDownListFor(m => m.ArrayName[i], Model.ListOfPotentialValues, new {})
     @Html.ValidationMessageFor(m => m.ArrayName[i])
}

更清楚地说,ArrayName 是一个字符串数组 (string[]),ListOfPotentialValues 的类型是 IEnumerable&lt;SelectListItem&gt;

模型代码如下:

public IEnumerable<SelectListItem> ListOfPotentialValues
{
    return SelectList(/* A list of Strings*/)
}

public string[] ArrayName { get; set; }

//Constructor
public foo()
{
    ArrayName = new string[] {"Foo", "Foo", "Baz","Qux"};
}

视图为第一个下拉菜单发送以下 HTML 输出(这对所有下拉菜单都是一致的)

<div>
    <label for="ArrayName_0_">Index 0</label>
    <select id="ArrayName_0_" name="ArrayName[0]">
        <option>Foo</option>
        <option>Bar</option>
        <option>Baz</option>
        <option>Qux</option>
    </select>
    <span class="field-validation-valid" data-valmsg-for="ArrayName[0]" data-valmsg-replace="true"></span>
</div>

由此,您可能推导出 ArrayName 当然是包含我想要显示的值的数组的名称,而 ListOfPotentialValues 是可能选择的值的 SelectList ,也可能没有推导出来。值列表正在显示,但没有像我不使用数组那样设置它的值。

虽然没有填充下拉列表的值,但如果我在 MVC 模板中调用 @Model.ArrayName[i],我可以显示它的值。

更多细节: 如果ListOfPotentialValues 包含值Foo, Bar, Baz, QuxArrayName 包含值Foo, Foo, Qux, Baz

我希望下拉列表以 Foo、Foo、Qux、Baz(分别)的值开始,同时仍然可以选择 Foo、Bar、Baz 和 Qux

我缺少什么简单的东西吗?

【问题讨论】:

  • ArrayName的类型是什么? ListOfPotentialValues?您能否提供正在输出的 HTML 示例?
  • 我相信这个编辑满足你的要求

标签: c# arrays asp.net-mvc


【解决方案1】:

不幸的是,这不起作用 - DropDownListFor() 在循环中使用时与其他助手的工作方式略有不同(它在 CodePlex 上被作为一个问题提出了几次,我不确定它是一个错误还是只是一个助手的限制)。

您需要为您的模型自定义 EditorTemplate 并将 SelectList 作为附加视图数据传递给模板(但这不适用于您的情况,因为您只有一个值类型数组),或者您需要构造在每次迭代中创建一个新的SelectList,并使用设置Selected 值的重载。例如,您的模型需要一个作为对象集合的属性(不是SelectList

@Html.DropDownListFor(m => m.ArrayName[i], new SelectList(Model.MyCollection, "yourValueProperty", "yourTextProperty", Model.ArrayName[i])

【讨论】:

  • 这个答案在解释 what 错误方面做得更好
【解决方案2】:

我觉得你使用SelectList的方式有问题,试试:

@Html.DropDownListFor(m => m.ArrayName[i], new SelectList(list, null, null, Model.ArrayName[i]), new {})

不确定它是否适用于字符串列表,您可能需要将它们转换为 C# 对象。

http://www.codeproject.com/Questions/701424/Default-value-for-html-DropdownListFor-in-MVC-Razo

【讨论】:

  • 我不确定是不是这样。在问题中,我声明值列表正在显示,但没有像我不使用数组时那样设置它的值。也就是说,在我使用 string[] 之前,这些字段已经填充。当我移到数组版本时,问题就开始了。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多