Как мне заполнить Html.DropDownListFor <> данными из модели сущностей? - PullRequest
1 голос
/ 24 февраля 2012

Я очень новичок в 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 ]

3 голосов
/ 24 февраля 2012
<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>
0 голосов
/ 24 февраля 2012

Используйте это для категорий

<%  
    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>Недвижимость категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...