如何使用DropDownListFor在控件数组上设置默认值

时间:2015-03-03 16:27:37

标签: asp.net-mvc razor html.dropdownlistfor

我有一个包含对象数组的视图模型。这些对象中的每一个都有一对来自下拉列表的值。这是一个简短的例子:

public class MarketAllocation{
        public int MarketId;
        [SelectListProvider(typeof(ProvidersIdSelectListProvider))]
        public int Provider1Id { get; set; }
        [SelectListProvider(typeof(ProvidersIdSelectListProvider))]
        public int Provider2Id { get; set; }
}

public class EditViewModel{
    public List<MarketAllocation> MarketAlloctions;
    [SelectListProvider(typeof(ProvidersIdSelectListProvider))]
    public int Provider1Id;  // this is for testing purposes
}

有许多市场,每个市场都有一个或两个供应商。在视图中,我使用自定义帮助器来获取SelectListProvider属性,使用它来获取选择列表,然后将列表与表达式一起传递给标准的DropDownListFor帮助器。所以在razor模板中我有:

        @for (int i = 0; i < Model.MarketAllocations.Count(); i++)
        {
                    @Html.MyDropDownListFor(m => m.MarketAllocations[i].Provider1Id)
                    @Html.MyDropDownListFor(m => m.MarketAllocations[i].Provider2Id)
        }
        @Html.MyDropDownListFor(m => m.Provider1Id)

帮手是这样的:

    public static MvcHtmlString MyDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        /// code to get the select list removed for brevity
        return html.DropDownListFor(expression, selectList);
    }

MarketAllocations的下拉列表都会呈现,但都默认为列表中的第一项。 EditViewModel中的Provider1Id默认为下拉列表中的正确值。我添加了TextBoxFors来从MarketAllocations中呈现ProviderId值,并且可以看到它们已正确设置。这让我认为问题是数组,因为传递给DropDownListFor的表达式是这样的:

m => m.MarketAllocations.get_Item(value(ASP._Page_Views_AdProfile_Edit_cshtml+<>c__DisplayClass2).i).Provider1Id

当我在视图模型中使用provider1Id属性时,表达式为:

m => m.Provider1Id

我有一个解决方法(视图模型中的辅助函数接受id并提供选择了正确值的选择列表)但是它很麻烦,并且涉及将存储库提取到视图模型中以便#&# 39;不理想。

有没有人知道如何使DropDownListFor正确使用这样的对象数组?

编辑:对不起,应该提到这是在IIS 8.5中托管的MVC 4。

0 个答案:

没有答案