Как заполнить раскрывающийся список в пользовательском элементе управления MVC ascx view? - PullRequest
3 голосов
/ 26 марта 2010

У меня есть выпадающий список, жестко запрограммированный на странице управления пользователями MVC View, и я хочу заполнить его из таблицы базы данных Страница просмотра MVC Наследует данные, поступающие с моего контроллера. Этот раскрывающийся список будет содержать что-то вроде списка состояний, чтобы пользователь мог установить элемент для моего основного объекта. Этот список не вписывается в данные, которые передаются в представление.

Где и как вы могли бы получить данные для раскрывающегося списка в пользовательский элемент управления MVC View? Пользовательские элементы управления Webform имеют страницу с выделенным кодом, которая может помочь загрузить эту информацию из базы данных и перейти на сторону рендеринга HTML. Как это можно сделать с помощью MVC, используя правильный подход к разделению интересов?

Контроллер

public ActionResult Inboxes() 
{ 
    var vm = new ListInboxesViewModel(); 
    vm.Inboxes = MyDataService.GetInboxes().OrderBy(i => i.InboxName); 
    return View(vm); 
} 

Главный вид

<% Html.RenderPartial("InboxesGrid", Model.Inboxes); %>

Частичное представление

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MoniteredInbox>>" %> 
<div> 
   <table>
       <tr><td>
           <select id="SelectedStateddl">
               <!-- Selected states from database Table -->
           </select>
       </td></tr>
   </table> 
</div> 

Ответы [ 2 ]

4 голосов
/ 26 марта 2010

Жаф - предложение Бена Дугуида - это хорошо. Вы также можете создать частичное представление, которое будет отображаться вашим основным видом и передавать необходимый фрагмент модели.

Например ... У меня строго типизированное представление "Входящие", которое привязано к моему InboxesViewModel. Затем я отрисовываю частичное представление InboxesGrid, а также передаю список входящих сообщений. Мое частичное представление также строго типизировано и позволяет мне использовать данные любым удобным для меня способом.

CONTROLLER

    public ActionResult Inboxes()
    {
        var vm = new ListInboxesViewModel();
        vm.Inboxes = MyDataService.GetInboxes().OrderBy(i => i.InboxName);
        return View(vm);
    }

ГЛАВНЫЙ ВИД

    <% Html.RenderPartial("InboxesGrid", Model.Inboxes); %>

ЧАСТИЧНЫЙ ВИД

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MoniteredInbox>>" %>
    <div>
        <%= Html.DropDownListFor(model=>model.Inbox.InboxId, 
                 Model.Inboxes.ToSelectList(
                       x => x.InboxId.ToString(), 
                       x => x.InboxName, 
                       Model.Inbox.InboxId.ToString(),
                       "[ Select One ]")) %>
    </div>

МЕТОД РАСШИРЕНИЯ

public static SelectList ToSelectList<T>(this IEnumerable<T> list,
                                         Func<T, string> value,
                                         Func<T, string> text,
                                         string firstValue,
                                         string firstText)
{
    var firstSelectListItem = new { Value = firstValue, Text = firstText };

    var collection = (new[] { firstSelectListItem })
        .Concat(list.Select(x => new { Value = value(x), Text = text(x) }));

    return new SelectList(collection, "Value", "Text");
}
1 голос
/ 26 марта 2010

Если вы используете ASP.NET MVC 2, вы можете воспользоваться методом RenderAction в помощнике HTML:

<% Html.RenderAction(actionNamne, controllerName); %>

Это вызовет указанное вами действие и контроллер, который затем может вызвать представление UserControl напрямую со своей моделью.

Это позволит вам создать подходящую модель представления для раскрывающегося списка.

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