理解MVC中的模型类与数据类

时间:2017-05-25 13:39:18

标签: asp.net asp.net-mvc model

我多年来使用Webforms开发了ASP.Net应用程序,我已经完成了一些MVC应用程序,但实际上从未真正使用过该框架,这是由于大多数项目的时间限制。虽然,我正在使用MVC结构,我仍然使用旧方法,即不使用@ Html.BeginForm等,而是使用标签等。

我刚刚开始了另一个项目,但这次我想使用正确的MVC功能。

我一直在阅读有关设计模式的最佳实践。在我的解决方案中,我有用于MVC应用程序,测试和数据的项目(这是一个连接到数据库的类库)。我没有使用实体框架,但我仍然想知道为View Models创建类的正确方法。

在我的数据库类中,我有一个类调用用户

public class User
{
    public long Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public long RoleId { get; set; }
}

我想在View上呈现的字段是NameId的名称,电子邮件和下拉列表。因此,对于View上的Model,它是否正确,它不必与我的Data Class相同?低于正确的模型视图类?

public class UserModel
{
    public Data.User User { get; set; }

    public IEnumerable<KeyValuePair<long,string>> RoleList { get; set; }
}

问的原因是,最初,我总是假设Model类应该与我在Google中读过的Data类相同,在大多数情况下它不是。这是对的吗?

这是视图的正确实现吗?

@using (Html.BeginForm())
{
   @Html.LabelFor(m=>m.User.Name)
   @Html.TextAreaFor(m=>m.User.Name)
   <br/>
   @Html.LabelFor(m => m.User.Email)
   @Html.TextAreaFor(m => m.User.Email)
   <br />
   @Html.LabelFor(m => m.User.RoleId)
   @Html.DropDownListFor(m => m.User.RoleId, new SelectList(Model.RoleList, 
    "Value", "Key"),"--Please Select--")
}

2 个答案:

答案 0 :(得分:1)

您可以采取的最佳方法是为要在其上公开数据/捕获数据的每个视图创建模型(新类)。这可以说是更多的工作,但它确实有一些巨大的优势。首先,您最终不会将视图与您的域紧密耦合,即您的Users表可能有20列但您只想将2暴露给登录页面(用户名/密码)。其次,特别是通过MVC框架和剃刀,您可以获得一些关于验证(服务器端和客户端)以及显示名称等内容的帮助。 此外,关于管理依赖关系层次结构,您不希望通过引用System.Web.MVC aarrrgh来丢弃所有域模型!!

“更多工作”部分来自控制器,您需要验证视图模型,然后将模型对象转换为域对象,以便您的业务类从此开始使用一致的域模型。

关于您的模型类提案,我会更喜欢这样做

public class UserModel
{
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email Address")]
    public string EmailAddress { get; set; }

    [Required]
    [Display(Name = "Roles")]
    public IEnumerable<KeyValuePair<long, string>> RoleList { get; set; }
}

正如您在上面所看到的,因为我有一个可以完全支持视图的粒度模型(而不是引用User对象)我现在可以根据需要为每个字段添加特定的验证

我确信有很多更好的理由走这条路,我现在想不到,但我认为这会让你思考正确的路线。快乐的编码。

答案 1 :(得分:0)

模型类代表应用程序的业务方面,因为在您的情况下,您有一个 UserModel 类,其中包含用户信息和具有该角色的集合,其中数据模型特定于存储库,即您的情况下的数据库表,因此数据模型通常表示我们拥有的数据库表。希望它有意义。

您还可以参考以下帖子,其中提出类似的问题:

https://stackoverflow.com/a/2446051/1875256