2014-09-18 96 views
1

我环顾四周,发现一些亲密的答案,但我还没有看到一个。是这样的:ASP.NET MVC复杂视图映射

使用实体框架我有以下几点:

的榜样:

public class Role 
{ 
    [Key] 
    public short RoleId { get; set; } 
    public string RoleName { get; set; } 
    public string RoleDescription { get; set; } 
} 

用户模型:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string Username { get; set; } 

    //more fields etc... 

    public virtual ICollection<UserRole> UserRoles { get; set; } 
} 

和UserRole的模型:

public class UserRole 
{ 
    [Key] 
    public int UserRoleId { get; set; } 
    public int UserId { get; set; } 
    public short RoleId { get; set; } 
    public virtual Role Role { get; set; } 
} 

我想要做的是确定如何编写viewmodel,以便在编辑用户时创建新用户和可用+所选角色列表时显示所有可用角色的列表。我可以实现已经使用foreach的第一部分,但我觉得它很脏。

在我看到的所有例子中,整个viewmodel被封装在主视图上的一个IEnumerable中,并且使用@ Html.EditorForModel()和一个编辑器模板来呈现。这似乎允许将视图数据自动映射回底层模型。我想用同样的技术来实现这一点,但似乎无法围绕处理单一用户模型中的Role/UserRole集合的问题。

的StackOverflow问题,我引用:Generate Dynamically Checkboxes, And Select Some of them as Checked

+0

“我觉得这是脏” 是不足够的理由放弃的技术。如果它导致你的维修头痛,那么通过一切手段去做别的事情,但不要因为有人说这是一种不好的做法而解雇一个想法。 – 2014-09-18 22:26:23

+0

您的模型没有指示是否为用户选择角色的属性,因此您需要创建视图模型来表示要显示/编辑的内容 – 2014-09-18 22:29:49

+0

@ stephen-muecke我知道我应该使用视图模型。我的主要困惑在于如何定义视图模型,然后在编辑器模板中实现它,以便它仅遍历IEnumerable/ICollections的那些属性。 – 2014-09-18 22:34:37

回答

2

我建议2个视图模型编辑

public class RoleVM 
{ 
    public short RoleId { get; set; } 
    public string RoleName { get; set; } 
    public bool IsSelected { get; set; } 
} 
public class UserVM 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<RoleVM> Roles { get; set; } 
} 

GET方法

public ActionResult Edit(int ID) 
{ 
    UserVM model = new UserVM(); 
    // map all avaliable roles to model.Roles 
    // map user to model, including setting the IsSelected property for the users current roles 
    return View(model); 
} 

查看

@model YourAssembly.UserVM 
... 
@Html.TextBoxFor(m => m.Name) 
... 
@EditorFor(m => m.Roles) 

EditorTemplate(RoleVM.cshtml)

@model YourAssemby.RoleVM 
@Html.HiddenFor(m => m.RoleId) // for binding 
@Html.CheckBoxFor(m => m.IsSelected) // for binding 
@Html.DisplayFor(m => Name) 

POST方法

[HttpPost] 
public ActionResult Edit(UserVM model) 
{ 
    // model.Roles now contains the ID of all roles and a value indicating if its been selected 
+0

这工作得很好。我在创建POST控制器时遇到了一个参数绑定的问题,这让我觉得我的视图模型更早被破坏了。我继续前进,并按照您的示例将其删除,似乎运行良好。 – 2014-09-18 23:33:35