如何在ascx视图用户控件MVC上填充下拉列表?

时间:2010-03-26 15:33:52

标签: c# html asp.net-mvc

我在MVC View User Control页面中有一个硬编码的下拉列表,并希望从数据库表中填充它。 MVC视图页面继承来自我的控制器的数据。此下拉列表将包含类似状态列表的内容,供用户选择为主对象设置项目。此列表不适合传递给View的数据。

在何处以及如何将下拉列表的数据导入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 个答案:

答案 0 :(得分:4)

Zhaph - Ben Duguid's suggestion是个好人。您还可以创建主视图呈现的局部视图,并将模型的必要部分传递给。

例如......我有一个强类型的“收件箱”视图,它绑定到我的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); %>

PARTIAL VIEW

    <%@ 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 :(得分:1)

如果您使用的是ASP.NET MVC 2,则可以利用HTML帮助程序上的RenderAction方法:

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

这将调用您指定的动作和控制器,然后可以使用它的模型直接调用UserControl视图。

这将允许您为下拉列表构建合适的视图模型。