Asp.Net MVC2 TekPub Starter Site方法问题

时间:2010-06-07 20:08:15

标签: asp.net-mvc architecture

好的,我刚刚碰到这个,我本来应该检查我的电子邮件但是我最终看了这个(并且不远处订阅了TekPub)。

http://tekpub.com/production/starter

现在这个应用程序是一个很好的起点,但它为我提出了一个问题,并且我已经证明了开发过程(正确或错误)。将数据传递给视图时,LinqToSql对象没有转换。对此有任何否定吗?

我能看到的主要部分是验证,这在使用MVC的内置验证时是否会引起问题,因为这是我们可扩展使用的东西。因为我们使用LinqToSql生成的内置对象,所以如何添加验证,如

[Required(ErrorMessage="Name is Required")]
public string Name {get;set;}

有兴趣了解这种方法的好处以及我们应该接受的任何否定因素,通过开发过程进行实验。

是否应该将其作为指南,我们应该使用ViewModels?如果是这样,即使在简单的情况下我们也应该使用它们应用程序逻辑中的实现/转换为ViewModel的方式/位置在哪里?

1 个答案:

答案 0 :(得分:1)

使用实体对象,您可以使用好友类,从而创建第二个类,充当您实体的元数据提供者。例如,使用Linq-to-Sql生成的Customer实体,我可以像这样创建一个伙伴类:

[MetadataType(typeof(CustomerMeta))]
partial class Customer {

}

public class CustomerMeta {

  [DisplayName("Forename", Required(ErrorMessage = "Forename is required.")]
  public string Forename { get; set;}
}

实体是作为部分类生成的,因此您可以将自己的代码添加到它们中。

或者,你可以放弃将你的实体类型推送到你的视图并根据所需的功能创建特定的模型,例如我通常会有一个User实体,但是当我需要创建一个User时,我有一个叫做CreateUserSpec的东西模型:

public class CreateUserSpec
{
  [DisplayName("Forename")]
  public string Forename { get; set; }
}

其中包含用户属性的子集,仅包含创建用户所需的属性。这是我将传递给我的视图的模型,并从表单数据重新填充。例如:

public class AccountController
{
  public ActionResult Register() {
    return View(new CreateUserSpec());
  }

  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Register(CreateUserSpec spec) {
    if (!ModelState.IsValid) {
      return View(spec);
    }

    var user = UserFactory.CreateUser(spec);

    // Redirect to authorisation page?
  }
}