【问题标题】:Creating Listbox with strongly typed view?使用强类型视图创建列表框?
【发布时间】:2009-09-01 04:45:33
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    不确定我是否理解整个问题,但如果您要问如何才能使该模型在页面中可用,请确保该页面继承自 ViewPage&lt;UserAdminEditViewModel&gt;

    此外,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() 两次。这个解决方案应该会消失,但是如果您仍然需要引用它,如果您没有在方法调用本身中缓存它,我建议您在操作中缓存它,这样您就不会在每次需要列表时都访问数据库.

    我认为这回答了你的问题。如果不是,请澄清。另外,我还没有测试过这段代码,所以不能保证它可以编译,但它应该可以工作。

    【讨论】:

    • _ug.GetUsergroups() 获取所有用户组,如何将“u.Usergroups”中的选定用户组应用到该用户组,以便获得正确的类型等?模型中的更多内容?
    • 它是 MultiSelectList 的一部分。我修复了我提供的返回视图的错误并添加了更多代码。
    • 作为 MultiSelectList 的一部分,列表本身包含所有值,然后包含在当前对象中选择的值。
    • 后背看起来如何?我得到“没有 ViewData 项,其键为 'IEnumerable' 类型的键 'SelectedGroups'。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多