【问题标题】:MVC3: Create View populating data in object and in attribute object at same timeMVC3:创建视图同时在对象和属性对象中填充数据
【发布时间】:2012-11-03 20:08:00
【问题描述】:

我很确定以前已经回答过这个问题,但是我很难找到任何可以帮助我的东西。问题是:

我有一个泛型类和它的特化,比如一个 PERSON 和一个 CLIENT(它是一个 PERSON)。所以,我在数据库上有 2 个表,它们是:

PESSOA_FISICA
  ID_PESSOA_FISICA  Identity
  TX_NOME           Varchar(120)
  TX_CPF            Char(8)
  DT_NASCIMENTO     DateTime

CLIENTE_VAREJO
  ID_CLIENTE_VAREJO Identity
  ID_PESSOA_FISICA  Int      (FK to PESSOA_FISICA)
  IN_STATUS         Char(1)
  TX_FILIAL         Varchar(20)

对于 C# 类,我得到了这个:

[Table("PESSOA_FISICA")]
public class PessoaFisica
{
    [Key]
    [Column("ID_PESSOA_FISICA")]
    public int? IDPessoaFisica { get; set; }

    [Column("TX_NOME")]
    public string Nome { get; set; }

    [Column("TX_CPF")]
    public string CPF { get; set; }

    [Column("DT_NASCIMENTO")]
    public DateTime Nascimento { get; set; }
}

[Table("CLIENTE_VAREJO")]
public class ClienteVarejo
{
    [Key]
    [Column("ID_CLIENTE_VAREJO")]
    public int? IDClienteVarejo {get;set;}

    [Column("ID_PESSOA_FISICA")]
    [ForeignKey("PessoaFisica")]
    public int IDPessoaFisica { get; set; }

    public virtual PessoaFisica PessoaFisica { get; set; }

    [Column("IN_STATUS")]
    public String Status { get; set; }

    [Column("TX_FILIAL")]
    public String Filial { get; set; }
}

问题是......我只是不知道如何创建一个 CREATE 视图,该视图可以接受数据到 ClienteVarejo 模型,但同时也接受到 PessoaFisica(因为,每当我输入数据时一个新的 ClienteVarejo,我也必须为新的 PessoaFisica 输入数据。

我已经意识到,在一个强类型为 ClienteVarejo 的视图中,我可以使用 Razor 语法,例如:

@Html.EditorFor(model => model.PessoaFisica.Nome)

但在我的情况下(即:同时创建两个对象),如何使模型验证发生在两个对象上?

感谢您能给我的任何帮助... :)

马塞洛·米拉 巴西里约热内卢

【问题讨论】:

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


    【解决方案1】:

    不要将域模型用于您的视图。创建一个特定于您的视图的新 POCO 类。我们称之为 ViewModel

    public class CreateClientVM
    {
      [Required]
      public string ClientName { set;get;}
      [Required]
      public string ContactPersonName { set;get;}
    
      //other properties here as needed
    }
    

    现在在 GET 操作中创建此类的对象并传递给 View 方法。

    public ActionResult CreateClient()
    {
      var vm=new CreateClientVM();
      return View(vm);
    }
    

    使您的视图强类型化到 ViewModel 类。

    @model CreateClientVM
    @using(Html.BeginForm())
    {
      @Html.LabelFor(x=>x.ClientName)
      @Html.TextBoxFor(x=>x.ClientName)
    
      @Html.LabelFor(x=>x.ContactPersonName)
      @Html.TextBoxFor(x=>x.ContactPersonName)
    
      <input type="submit" />
    }
    

    当用户提交表单时,从视图模型中读取值并将其分配给您的域模式对象并保存。感谢 MVC 模型绑定。 :)

    [HttpPost]
    public ActionResult CreateClient(CreateClientVM model)
    {
      if(ModelState.IsValid)
      {
        var domainModelClient=new ClienteVarejo();
        domainModelClient.Name=model.ClientName;
        domainModelClient.ContactPerson=new ContactPerson();
        domainModelClient.ContactPerson.Name=model.ContactPersonName;
    
        yourRepositary.SaveClient(domainModelClient);  
        //If saved successfully, Redirect to another view (PRG pattern)
        return RedirectToAction("ClientSaved");
      }
      return View(model);    
    }
    

    【讨论】:

    • 嘿,@Shyju,感谢您的帮助。这是肯定的! :D 我唯一剩下的担心是,在为这种情况的每个人使用 POCO 类时,我最终可能会得到两倍数量的类(一个用于真实模型,另一个用于查看这些模型)。但是,至少这是一个简单明了的解决方案。非常感谢!! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多