2013-04-09 76 views
1

我對ASP.Net MVC有點新,我有一個複雜的模型。在主視圖中創建複雜模型的多個部分

public class BuildingPermit 
{ 
    public int ApplicationID { get; set; } 
    public virtual Person Applicant { get; set; } 
    public virtual Area ApplicantArea { get; set; } 
    public virtual ICollection<Owner> Owners { get; set; } 
    /... 
} 

使用腳手架,我創建了控制器和所有視圖。但是,我想在同一頁面中註冊所有詳細信息,即在BuildingPermitCreate視圖中創建Applicant類型的細節Person,ApplicationArea類型Area等。有什麼辦法可以做到這一點?

如果這是不可能的,我認爲可以添加一個鏈接來創建對象。當用戶點擊它時,頁面會轉到該視圖,創建它,獲取其信息並在BuildingPermit的視圖中顯示它。

我很感謝您的幫助。

回答

1

你可以通過創建人,面積,業主的編輯模板,實現這一目標等在:

~/Views/Shared/EditorTemplates/Person.cshtml 
~/Views/Shared/EditorTemplates/Area.cshtml 
~/Views/Shared/EditorTemplates/Owner.cshtml 

編輯模板將要被強類型的,應該給編輯佈局類型:

@model Models.Person 
<h2>Person</h2> 
<p> 
    @Html.LabelFor(model => model.Name) 
    @Html.EditorFor(model => model.Name) 
</p> 
<p> 
    @Html.LabelFor(model => model.Address) 
    @Html.EditorFor(model => model.Address) 
</p> 
// And so on 

一旦你完成了這個調用@Html.EditorFor(model => model.Applicant)將拿起你的模板並顯示在你的編輯視圖。

如果您想要一起顯示所有這些信息,那麼您可能還需要爲這些類型創建顯示模板。除了將模板保存在DisplayTemplates文件夾中之外,這些工作與編輯器模板一樣。

~/Views/Shared/DisplayTemplates/Person.cshtml 
~/Views/Shared/DisplayTemplates/Area.cshtml 
~/Views/Shared/DisplayTemplates/Owner.cshtml 
+0

令人驚歎。我是否可以複製Person的「編輯」或「創建」模板等等到「EditorTemplates」文件夾?如果是這樣,我應該複製哪一個? – 2013-04-09 09:19:10

+0

還有一個問題。我複製並編輯了Person的「創建」視圖,並將@ Html.EditorFor ...添加到了視圖中,並且它工作正常。但是,我不確定創建請求的工作原理。我的意思是,當我單擊父視圖的提交按鈕(上面的'BuildingPermit')時,它是否會自動發佈並保存所有表的所需信息?或者我應該手動處理? – 2013-04-09 09:26:10

+0

腳手架文件將被設置爲發佈到您的控制器。您將要刪除'@ Html.BeginForm()'和任何創建或編輯標題。您的模板應該只包含顯示模板所需的內容,例如'@ Html.LabelFor()','@ Html.TextBoxFor()','@ Html.ValidationMessageFor()'等等。 – 2013-04-09 09:31:20

0

這是沒有問題的,只是確保你初始化你的複雜的對象以某種方式避免空引用異常:

public BuildingPermit() 
{ 
    this.Applicant = new Person(); 
    this.ApplicantArea = new Area(); 
    ... 
} 

然後在您的控制器的操作方法創建模型的實例,並把它傳遞到您的視圖:

​​

對於視圖:

@model MyNamespace.BuildingPermit 

@Html.LabelFor(m => m.Applicant.FirstName)<br /> 
@Html.TextBoxFor(m => m.Applicant.FirstName)<br /> 

... 

<input type="submit" value="Create new building permit" /> 

接着看通過在線示例說明如何在您的MVC控制器中處理HttpPost

如果要爲每種對象類型創建特定的UI部分,則可以查看EditorForDisplayFor模板。從你在原文中提到的內容來看,這可能也是你正在尋找的東西。

希望這會有所幫助。

+0

謝謝。在這種方法和@Macs建議的方法之間哪一種方法更「正式」? – 2013-04-09 09:20:04

+1

@Macs是一個非常好的答案,它是使用'EditorFor'模板的一個很好的描述,它似乎是你正在尋找的。兩種方法都是有效的方法,但如果要在其他視圖中編輯/顯示Person,Area和Owner對象,則「EditorFor」解決方案爲您提供更大的靈活性。 – 2013-04-09 11:35:04

相關問題