2011-10-17 47 views
0

我有了這兩個創建和編輯,我把他們分爲局部視圖中的項目的能力的看法:我有獨立的ViewModelsASP.net MVC - 綁定形式值不同的名稱

MainEditView.cshtml 
_CreateChildDialog.cshtml 
_EditChildDialog.cshtml 

同時爲創建和子項:

public class CreateChildViewModel 
{ 
    public string ItemText { get; set; } 
} 


public class EditChildViewModel 
{ 
    public string ItemText { get; set; } 
} 

因爲用於編輯局部視圖,並創建對話框都將在同一個頁面上呈現,我將有形式的id和名稱衝突...因爲他們都被稱爲ItemText。

是否可以自定義這些元素的綁定而無需編寫自定義模型綁定器?

我想這樣做:

public class EditChildViewModel 
{ 
    [BindFrom("EditItemText")] 
    public string ItemText { get; set; } 
} 

或者它只是更有意義的視圖模型屬性重命名爲:基於與達林我converstation

public class EditChildViewModel 
{ 
    public string EditItemText { get; set; } 
} 

public class CreateChildViewModel 
{ 
    public string CreateItemText { get; set; } 
} 

編輯 想讓這個更清楚一點。

我的父母有編輯操作。 編輯父項時,當您調用ParentController.Edit操作時,絕不會創建新子項或編輯子項。

我有,有一個創建子對象和編輯方法單獨的控制器:

public class ChildController 
{ 
    public ActionResult Edit() {} 
    public ActionResult Create() {} 
} 

我使用jQuery調用異步張貼到該控制器時,編輯或創建一個孩子。基本上我使用jquery對話框來創建/編輯一個孩子,當我點擊對話框上的確定後,這個孩子會立即得到保存。甚至在單擊保存父級的「編輯」操作之前,也會發生這種情況。

回答

3

我會使用編輯器模板。通常你會收拾這兩個視圖模型到這將是由主視圖中使用的主視圖模型:

public class MyViewModel 
{ 
    public CreateChildViewModel Create { get; set; } 
    public EditChildViewModel Edit { get; set; } 
} 

然後:

@model MyViewModel 
@Html.EditorFor(x => x.Create) 
@Html.EditorFor(x => x.Edit) 

,我會通過自己的相應的編輯器代替兩個諧音模板(~/Views/Shared/EditorTemplates/CreateChildViewModel.cshtml~/Views/Shared/EditorTemplates/EditChildViewModel.cshtml)。編輯器模板將生成相應輸入元素的專有名稱和ID。

就我個人而言,我傾向於更喜歡編輯器/顯示模板而不是部分,因爲它們處理輸入元素的更好命名。

+0

如果將CreateChild/EditChild調用與父代分開獨立,這仍然適用嗎?我正在使用jQuery AJAX調用將其提交給與「父」項不同的控制器。 – Dismissile

+0

@Dismissile,所以您發佈的操作分別將'CreateChildViewModel'和'EditChildViewModel'作爲參數?在這種情況下,您可以指定前綴,以便默認的模型綁定器可以成功綁定它:'public ActionResult Create([Bind(Prefix =「Create」)] CreateChildViewModel model){...}'。 –

+0

是的。在我的情況下,你永遠不會保存一個父母和一個孩子。我會更新我的帖子以更清楚地反映這一點。 – Dismissile