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モデルだけでなく、同時にPessoaFisicaにもデータを受け入れることができるCREATEビューを作成する方法がわかりません(新しいClienteVarejoのデータを入力するときはいつでも) 、新しいPessoaFisicaのデータも入力する必要があります)。

ClienteVarejoとして強く型付けされたビューでは、次のようなRazor構文を使用できることをすでに認識しています。

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

しかし、私の場合(つまり、両方のオブジェクトを同時に作成する場合)、モデルの検証を両方のオブジェクトに対して行うにはどうすればよいですか?

あなたが私に与えることができるどんな助けにも感謝します...:)

マルセロミアラリオデジャネイロ、ブラジル

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
}

次に、youtGETアクションで、このクラスのオブジェクトを作成し、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 に答える