使用强类型视图创建列表框?

时间:2009-08-31 14:24:43

标签: asp.net-mvc

我正在尝试将其“转换”为强类型模型而不是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

1 个答案:

答案 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()。这应该取消这个解决方案,但如果你仍然需要引用它,我建议你在行动中缓存它,如果你没有在方法调用本身缓存它,所以每次你需要列表时你都不会访问数据库

我认为这可以回答你的问题。如果没有,请澄清。此外,我还没有测试过这段代码,因此无法保证编译,但它应该可以正常工作。