2012-03-19 37 views
2

我想知道一些形式和部分形式的變化。提交在父頁面上,我已經改變了我傳遞給部分視圖的內容。我有一個相關的HomeViewModel父視圖(其中有公共屬性名稱和公衆人物員工{獲取;集;}MVC 3部分視圖和我需要發送給它的內容?

1)方案1:主要看有類似下面的

@model MasterDetailSample.Models.HomeViewModel 

@using (Html.BeginForm()) { 
    <div> 
     @{Html.RenderPartial("_PersonView", @Model);} 
    </div> 
    <input type="submit" value="Save" />   
} 

在這種情況下,我傳遞給部分視圖_PersonView整個HomeViewModel。在_PersonView局部視圖中,我必須通過@ model.Employee.Name引用HomeViewModel即Person對象的屬性(在這種情況下,提交在父窗體上(不在局部視圖中))

當我點擊提交在控制器的表單(POST),我必須通過以下模型訪問員工「姓名」的屬性。員工姓名

這似乎工作,但請注意以下變化方案2(其中我只傳遞給部分Employee對象)

2.)場景2 在這種情況下,我只想將Employee對象發送到局部視圖。開始表格和提交表格同樣在父表格上。

所以從母體形式我有

@{Html.RenderPartial("_MasterView", @Model.Employee);} 

,所以我通過@ Employee.Name引用Person對象的名稱屬性現在局部視圖內,當我提交控制器Employee對象內的形式不在自動模型活頁夾中可用。我可以從模型參數

[HttpPost] 
    public ActionResult Index(ModelViewModel model) { 
     **//model.Employee is null!** 
     return View(); 
    } 

爲什麼通過的FormCollection訪問屬性,但不是? (是model.Employee null)我希望我的部分視圖只接受Person類型的對象,但是在從父頁面提交後,Employee屬性爲null。在局部視圖我使用的@model線以下

@model MasterDetailSample.Models.Person 

我想偏只需要一個Person對象被髮送到它,但我想提交的主要形式。如果我這樣做,我可以在幾種情況下重新使用局部視圖,但是如果我必須發送HomeViewModel,我顯然限制了我可以如何使用這個局部視圖。所以,我只想使用Person作爲具有局部視圖的模型,但我需要能夠從父視圖提交時訪問屬性。

可以這樣做嗎?如果是的話如何?

THX

回答

1

你有兩個選擇:

1)一個我建議 - >不使用局部視圖,而不是使用EditorFor和創建人編輯模板。有了局部視圖,上下文就是你傳入視圖的任何模型,這就是爲什麼你的例子(1)起作用,而(2)不起作用。但是,使用編輯器模板時,父上下文會與html助手一起考慮,並會生成正確的輸入名稱。 Have a look at Darin Dimitrov's answer到類似的問題。

2)用你的第二個例子如,但改變後的行動看起來像這樣:

[HttpPost] 
public ActionResult Index(ModelViewModel model) { 
    TryUpdateModel(model.Employee); 
    **//model.Employee should now be filled!** 
    return View(); 
} 

3)使用自定義HTML傭工接受前綴輸入,參見this answer我貼了一段時間後例如代碼。你可以在你的局部視圖中使用它。