我在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>
答案 0 :(得分:4)
Zhaph - Ben Duguid's suggestion是个好人。您还可以创建主视图呈现的局部视图,并将模型的必要部分传递给。
例如......我有一个强类型的“收件箱”视图,它绑定到我的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); %>
<%@ 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视图。
这将允许您为下拉列表构建合适的视图模型。