MVC3:创建视图同时在对象和属性对象中填充数据

Posted

技术标签:

【中文标题】MVC3:创建视图同时在对象和属性对象中填充数据【英文标题】:MVC3: Create View populating data in object and in attribute object at same time 【发布时间】: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)

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

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

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

【问题讨论】:

【参考方案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

以上是关于MVC3:创建视图同时在对象和属性对象中填充数据的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 - 部分视图中的多个 Ajax 表单在刷新时都填充了相同的数据

根据上一个列表中选择的值填充下拉列表(asp.net mvc3)

如何在 Mvc3 中填充 ListBoxFor?

解析对象数组并填充表格视图单元格 Swift

使用 datareader 填充 mvc 模型时解决对象引用错误?

填充某些属性的javascript异步调用