2011-08-04 128 views
1

我正在試驗不顯眼的客戶端驗證,並一直在努力讓它在我的方案中工作。MVC3客戶端驗證使用ViewModels

我的主要問題是我的視圖有一個強類型的ViewModel。這個ViewModel包含了幾個用於填充下拉列表的集合,並有一個額外的屬性(我們稱之爲Person),這是我希望表單編輯的實際對象。

我的控制器操作處理帖子期望得到一個Person對象而不是整個ViewModel張貼。所以,我一直無法使用:

@Html.TextBoxFor(m => m.Person.Name) 

,因爲我需要輸入控制有一個名稱=「名稱」,而不是「Person.Name」 我可以用

@Html.TextBox("Name", m.Person.Name) 
更正此

但是,最終的輸入控件缺少客戶端驗證需要的數據屬性。 有沒有辦法讓客戶驗證工作,保持我的viewmodel,並使我的控​​制器行動一起工作?

在一個側面說明,好像在表單字段數據 - *屬性只加了,如果你使用

@using (Html.BeginForm()) 

用手寫出我自己的<form>標籤似乎打破它。

是否需要使用表單助手?

+0

您是否嘗試過使用TextBoxFor超載與htmlAttributes?就像調用類似於:@ Html.TextBoxFor(m => m.Person.Name,new {name =「Name」)? –

+0

我希望工作。它允許我添加新的屬性,但不覆蓋name屬性。我認爲這種行爲應該改變,所以你可以這樣做。 –

回答

1

以及在你列出的情況下,你的屬性的名稱將人作爲前綴像

<input type='text' name='Person.Name'..../> 
<input type='text' name='Person.Age'.../> 

那裏名字和年齡分別是人對象的屬性。你可以寫你喜歡張貼

[HttpPost] 

    public ActionResult Index(Person Person) 
    { 
     //handle person here 
    } 

這裏美中不足的是,如果你在你的表單元素收到前綴的名字對象模型綁定器就能填充它的操作方法。如果它不起作用(它對我有效),則可以使用Bind(Prefix="")屬性綁定您在後操作方法中的對象。對於綁定的使用例子看看How to use Bind Prefix?

+0

我明白了。是的,確實有用,非常感謝! –

0

你必須來裝點視圖模型屬性要與一個[Required]註釋這樣的驗證......

using System.ComponentModel.DataAnnotations; 
..... 
public class MyViewModel 
{ 
    ..... 
    [Required] 
    public string Name { get; set; } 
    ..... 
}