我正在尝试将其“转换”为强类型模型而不是ViewData。但那应该怎么样?
我在控制器中得到了这个:
public ActionResult UserEdit(int? userID)
{
User u;
if (userID == null)
{
u = new User();
}
else
{
u = _us.GetUsers(userID.Value).First();
u.Usergroups.Load();
}
List<int> selectedUsergroupIDs = new List<int>();
foreach (Usergroup item in u.Usergroups)
{
selectedUsergroupIDs.Add(item.UsergroupID);
}
MultiSelectList UsergroupID = new MultiSelectList(_ug.GetUsergroups(), "UsergroupID", "UsergroupName", selectedUsergroupIDs);
ViewData["UsergroupID"] = UsergroupID;
return View("UserEdit", new UserAdminEditViewModel { User = u, Usergroups = _ug.GetUsergroups() });
}
在这种情况下,“UsergroupID”,在我的模型和视图中需要添加什么?
提前致谢
/ M
答案 0 :(得分:1)
我不确定我是否理解整个问题,但如果你问你可以做些什么来使这个模型在页面中可用,请确保页面继承自ViewPage<UserAdminEditViewModel>
。
此外,MultiSelectList类具有选定和未选定的值,因此您无需在视图模型中同时使用它们,因此可以将它们配对到模型的单个成员。您需要将UserAdminEditViewModel
更改为类似的内容。
public class UserAdminEditViewModel
{
public User User { get; set; }
public IEnumerable<SelectListItem> UserGroups { get; set; }
}
在你的控制器结束时:
userGroups = new MultiSelectList(_ug.userGroups(), "Id", "Name", (from g in User.Usergroups select g.Id.Value).ToList()), new { size = 6 })
return View("UserEdit", new UserAdminEditViewModel { User = u, UserGroups = userGroups });
然后,在您的视图页面中:
<%@ Page Title="User Admin Edit" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserAdminEditViewModel>" %>
<%-- ... --%>
<% using (Html.BeginForm()) {%>
<div>
<label for="Title">User name:</label>
<%= Html.TextBox("Title", Model.User.Username) %>
</div>
<div>
<label for="Groups">Groups:</label>
<%= Html.ListBox("SelectedGroups", Model.UserGroups)%>
</div>
<%-- ... --%>
<% } %>
<%-- ... --%>
另外,请注意您正在两次调用_ug.GetUsergroups()。这应该取消这个解决方案,但如果你仍然需要引用它,我建议你在行动中缓存它,如果你没有在方法调用本身缓存它,所以每次你需要列表时你都不会访问数据库
我认为这可以回答你的问题。如果没有,请澄清。此外,我还没有测试过这段代码,因此无法保证编译,但它应该可以正常工作。