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

3
我有一个下拉列表在MVC视图用户控件页面中被硬编码,我想要从数据库表中填充它。MVC视图页面继承来自我的控制器的数据。这个下拉列表将包含一些州的列表供用户选择,以设置我的主对象的项目。这个列表不适合传递到视图中的数据。
在MVC视图用户控件中,您会在哪里以及如何获取下拉列表的数据?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> 

1
当然,一般来说,你不希望你的视图层直接与数据库交互。在我看来,视图应该相对“愚蠢”,并由控制器将数据传递给它们。 - user2189331
我在我的帖子中添加了更多信息... - RSolberg
2个回答

4

Zhaph - Ben Duguid提出的建议很好。您还可以创建一个部分视图,让主视图呈现并传递必要的模型片段。

例如...我有一个强类型视图,用于"Inboxes",绑定到我的InboxesViewModel。然后我呈现部分视图InboxesGrid,并传递收件箱列表。我的部分视图也是强类型的,并允许我在部分视图上以任何希望的方式使用数据。

控制器

    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");
}

我已经到这一步了。我想我的问题有点含糊不清。请参见我上面的更改... - MrM

1
如果您正在使用ASP.NET MVC 2,您可以利用HTML助手上的RenderAction方法:
<% Html.RenderAction(actionNamne, controllerName); %>

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

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


我已经到这一步了。我想我的问题有点含糊不清。请参见我上面的更改。 - MrM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接