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