2012-11-03 23 views
1

我很確定這已被回答,但我在找到任何可以幫助我的東西時遇到困難。問題是:MVC3:創建視圖在同一時間在對象和屬性對象中填充數據

我有什麼將是一個泛型類及其專業化,就像一個人和一個客戶(這是一個人)。所以,我對數據庫具有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一個觀點,我可以使用剃刀語法,如:

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

但在我的情況下(這就是:在同一時間創建兩個對象的),如何使兩個對象都發生模型驗證?

感謝您的幫助,您可以給我... :)

馬塞洛Myara 里約熱內盧,巴西

回答

2

不要使用域模型視圖。創建一個新的POCO類是特定於您的觀點。我們稱之爲ViewModel

public class CreateClientVM 
{ 
    [Required] 
    public string ClientName { set;get;} 
    [Required] 
    public string ContactPersonName { set;get;} 

    //other properties here as needed 
} 

現在YOUT 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);  
} 
+0

嘿,@Shyju,謝謝你的幫助。這當然會的,當然! :D我唯一擔心的是,在這種情況下,每個人使用POCO課程時,我最終可能會得到兩倍的課程數量(一個用於真實模型,另一個用於查看這些模型)。但是,至少這是一個簡單明瞭的解決方案。非常感謝!! :d –