我多年来使用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--")
}
答案 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 类,其中包含用户信息和具有该角色的集合,其中数据模型特定于存储库,即您的情况下的数据库表,因此数据模型通常表示我们拥有的数据库表。希望它有意义。
您还可以参考以下帖子,其中提出类似的问题: