1

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

我有一个泛型类及其专业化,例如 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; }
}

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

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

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

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

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

Marcelo Myara 巴西里约热内卢

4

1 回答 1

2

不要将域模型用于您的视图。创建一个特定于您的视图的新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);    
}
于 2012-11-03T20:18:21.490 回答