如何填充Html.DropDownListFor<>使用实体模型的数据?

时间:2012-02-24 12:37:40

标签: linq asp.net-mvc-2

我对ASP.NET MVC 2非常陌生,而且我在填充下拉列表时遇到了一大堆麻烦。<>使用实体模型中的数据。我怀疑我的LINQ可能是错误的,但找出我的代码无效的原因并没有什么坏处。

我设法预先填充另一个DropDownListFor<>使用以下代码:

        <div class="editor-field">
            <% string[] Days = new string[] { "Monday", "Wednesday", "Friday" };%>
            <%--<%: Html.DropDownList("Delivery Day", new SelectList(Days)) %>--%>
            <%: Html.DropDownListFor(model => model.DeliveryDay, new SelectList(Days))%>
            <%: Html.ValidationMessageFor(model => model.DeliveryDay)%>
        </div>

我现在尝试填充的列表如下所示:

        <div class="editor-field">
            <%  List<string> categoryList = new List<string>();
                var categories = from c in Model.Category select c.Category_Category;  
                foreach (object cata in categories)
                {
                    categoryList.Add(cata.ToString);
                }%>
            <%: Html.DropDownListFor(model => model.Category_Category,new SelectList(categoryList))%>
            <%: Html.ValidationMessageFor(model => model.Category)%>
        </div>

这就是:

找不到源类型'int?'的查询模式的实现。 “选择”未找到。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

<div class="editor-field">
    <%  var categories = Model.Category.ToArray().Select(x => new SelectListItem
        {
            Value = x.CategoryId.ToString(),
            Text = x.CategoryName
        });
    %>
    <%= Html.DropDownListFor(model => model.Category_Category, categories) %>
    <%= Html.ValidationMessageFor(model => model.Category) %>
</div>

这就是说我认为你错过了MVC模式的全部要点。你永远不应该做那样的事情。视图不应该做这样的事情。您不应该将EF域模型传递给您的视图。您应该使用视图模型并让控制器操作执行必要的查询并准备视图模型。

所以定义一个视图模型:

public class MyViewModel
{
    public string SelectedCategoryId { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
}

然后让您的控制器操作构建此视图模型:

public ActionResult Foo()
{
    var model = new MyViewModel();
    model.Categories = db.Category.ToArray().Select(x => new SelectListItem
    {
        Value = x.CategoryId.ToString(),
        Text = x.CategoryName
    });
    return View(model);
}

然后您的视图将被强烈输入MyViewModel,您将能够只显示下拉列表:

<div class="editor-field">
    <%= Html.DropDownListFor(x => x.SelectedCategoryId, Model.Categories) %>
    <%= Html.ValidationMessageFor(x => x.SelectedCategoryId) %>
</div>

答案 1 :(得分:0)

将此用于类别

<%  
    var categories = (from c in Model.Category select new SelectListItem 
        {
          Text = c.Category_Category.ToString(),
          Value = c.Category_Category.ToString() //or I will recommend using the key
        }).ToList();
%>    

然后

<%: Html.DropDownListFor(model => model.Category_Category, categories)%>

最好在您的控制器中执行此操作,并为包含List<SelectListItem>类别属性的视图设置单独的视图模型。