【问题标题】:Fetching data from database and populating a dropdownlist from a List<object> in MVC从数据库中获取数据并从 MVC 中的 List<object> 填充下拉列表
【发布时间】:2015-01-25 20:09:42
【问题描述】:

我有模特:

public partial class UserRole
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public int RoleID { get; set; }
    public int Status { get; set; }

    public virtual user Users { get; set; }
    public virtual Role Roles { get; set; }
}

public partial class user
{
    public user()
    {
        Roles = new List<SelectListItem>();
    }

    public long id { get; set; }
    public string email { get; set; }
    public string password { get; set; }
    public System.DateTime reg_date { get; set; }
    public byte validated { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
    public int RoleId { get; set; }
    public string RoleName { get; set; }

    public IEnumerable<SelectListItem> Roles { get; set; }

    //public IEnumerable<Role> Roles { get; set; }
}

public partial class Role
{
    public int ID { get; set; }
    public string RoleName { get; set; }
    public string Desc { get; set; }
    public int Status { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
}

控制器加载视图:

public ActionResult AssignRole(long id = 0)
    {
        user UserModel = new user();
        int UserId = Convert.ToInt32(id);
        IList<user> Users = new List<user>();
        var query = from Role in db.Roles
                    join UserRole in db.UserRoles on Role.ID equals UserRole.RoleID
                    join user in db.users on UserRole.UserID equals user.id
                    where UserRole.UserID == UserId
                    select new { RoleName  = Role.RoleName, email = user.email, UserId = user.id };



        var userss = query.ToList();
        foreach(var userList in userss)
        {
            Users.Add(new user()
                {
                    id = userList.UserId,
                    email = userList.email,
                    RoleName = userList.RoleName
                });
        }

        LoadRoles(Users);
        return View(Users);
    }

public void LoadRoles(IList<user> model)
    {

        var Roles = db.Roles.AsQueryable<Role>().Select(x => new SelectListItem()
        {

            Text = x.RoleName,
            Value = SqlFunctions.StringConvert((double) x.ID)
        }).ToList();

        var UserModel = new user()
        {
            Roles = Roles.ToList()
        };

    }

我能够在视图的第一部分从 LINQ 获取其他值,但无法填充下拉列表。

<fieldset>
<div>
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.email)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.RoleName)
            </th>
            <th></th>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.email)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.RoleName)
                </td>
                <td>
                    @Html.ActionLink("Delete", "Delete", new { id = item.id })
                </td>
            </tr>
        }
    </table>
</div>

<div class="display-label">
    @Html.DisplayName("Add Role")
</div>

@foreach (var item in Model)
{
    <div class="display-field">
        @Html.DropDownListFor(modeIteml => item.RoleId, item.Roles)
    </div>
}

<p>
    <input type="submit" value="Assign" />
</p>

如何填充下拉列表?我已经尝试了很多,但仍然没有运气。

【问题讨论】:

  • 我认为问题在于 LoadRoles 方法,因为您已通过 IList 模型但方法中没有 model.Roles 分配。
  • 你能在cshtml文件中显示你的@model吗?也许有什么问题?

标签: c# asp.net linq asp.net-mvc-4 html.dropdownlistfor


【解决方案1】:

这样写会更清楚:

public ActionResult AssignRole(int id = 0)
{
    var user = (from u in db.users
               join r in db.UserRoles on r.UserId equals u.id into g
               where u.id == id
               select new user
               {
                   id = u.id,
                   email = u.email,
 // assign the properties like any normal select.
                   Roles = g.Select(x => new Role { RoleName = x.rolename ... })
               })
               .FirstOrDefault();

    return View(user); // Update your view to expect a single user
}

通过这种方式,您可以在一次快速访问数据库的过程中获得所需的一切,并且您的模型代表您所拥有的(一个具有多个角色的用户)。

如果您想要一个可以分配的单独角色列表,我建议为该场景放置一个单独的视图模型。即

public class AssignRolesModel 
{
    public user User { get; set; }
    public IEnumerable<Role> AvailableRoles { get; set; }
}

然后将返回视图(用户)更改为:

var viewModel = new AssignRolesModel
               {
                   User = user,
                   Roles = db.Roles
                             .Select(x => 
                                new SelectListItem()
                                {
                                    Text = x.RoleName,
                                    Value = SqlFunctions.StringConvert((double) x.ID)
                                })
                             .ToList()
               };

return View(viewModel);

【讨论】:

  • 是的,我在这里从 LoadRoles 获取值,但无法将它们传递给主对象。有什么建议吗?
  • @naeemmalik 您必须遍历模型列表中的每个用户对象,并且必须设置 Roles 属性,因为您的 Roles 属性位于用户对象内。
  • @Sandeep 是对的。既然我不在手机上,我会更新我的答案,以便更清楚地了解最佳做法。
  • @Steve 我在 LINQ 查询中遇到错误。它说,“名称'r'不在'equals'左侧的范围内。考虑交换'equals'两侧的表达式。”。我已经尝试交换表达式,但似乎还没有工作。可能是它,因为“等于”运算符左侧的参数需要是对以前使用的表的引用。因为我只引用了用户 n 角色,但我有来自未引用的 UserRole 表的用户 ID。不知道如何在您的查询中修复它。另外,在您评论为“//分配属性”的角色中传递什么谢谢
  • 如果您不需要他们当前拥有的用户角色,那么您可以删除加入和角色分配。否则,改为加入用户角色
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2014-12-25
相关资源
最近更新 更多