我是ASP.Net MVC 3的新手,在嘗試實現客戶端不顯眼的驗證我爲創建自定義日期顯示的編輯器模板時遇到了一些問題辦法。ASP.Net MVC 3 - 客戶端編輯器模板的不顯眼的驗證
UI
我需要在3 texbox UI格式來顯示日期
我提出了一個EditorTemplate用於顯示日期的三個部分
@model DateTime?
<table class="datetime">
<tr>
<td>@Html.TextBox("Day", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("Month", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("Year", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
</tr>
<tr>
<td class="label">dd</td>
<td/>
<td class="label">mm</td>
<td/>
<td class="label">yyyy</td>
</tr>
</table>
型號
我有權約束出生場的日期是在我的模型,以該物業的子對象的屬性,在這種結構
MyModel
--> MySubModel
--> DateOfBirth
public class MySubModel
{
...
[DataType(DataType.Date)]
[Display(Name = "Date of birth")]
[DateTimeClientValidation()]
public DateTime DateofBirth { get; set; }
...
}
客戶端驗證
我已經把一個實現IClientValidatable的自定義驗證屬性設置爲
public class DateTimeClientValidationAttribute : ValidationAttribute, IClientValidatable
{
...
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
List<ModelClientValidationRule> clientRules = new List<ModelClientValidationRule>();
//Combined date should be valid
ModelClientValidationRule validDateRule = new ModelClientValidationRule
{
ErrorMessage = "Please enter a valid date.",
ValidationType = "validdate"
};
validDateRule.ValidationParameters.Add("dayelement", metadata.PropertyName + ".Day");
validDateRule.ValidationParameters.Add("monthelement", metadata.PropertyName + ".Month");
validDateRule.ValidationParameters.Add("yearelement", metadata.PropertyName + ".Year");
clientRules.Add(validDateRule);
return clientRules;
}
...
}
我試圖發佈日期,月&年的文本框到客戶端驗證元素的元素名稱,以便我將在稍後編寫客戶端jquery驗證方法和適配器,它將使用這些元素並進行驗證在客戶端。
查看
現在,使用這個編輯器模板,我把查看以下行
@model MyModel
...
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.MySubModel.DateofBirth)
</td>
<td class="editor-field">
@Html.EditorFor(m => m.MySubModel.DateofBirth)
@Html.ValidationMessageFor(m => m.MySubModel.DateofBirth)
</td>
</tr>
...
添加視圖作爲參考的所有相關jQuery驗證文件
問題
- 這不是發射出在HTML中不顯眼的JavaScript驗證屬性,雖然我已經實現IClientValidatable。 出於測試目的,當我把相同的屬性(DateTimeClientValidation)上的另一屬性在未使用該編輯模板的模型,然後將其發射出去的那些驗證特性,它不發射出來僅爲此編輯的模板。我哪裏可能出錯了?
- 關於編輯器模板的驗證消息範圍,是正確的,我把它放在View中,還是應該直接放在編輯器模板中(@ Html.ValidationMessageFor(m => m.MySubModel。出生日期))
- 在這個例子中,我是正確的設計,我已經把DateTimeClientValidationAttribute,這其實是我把模型的屬性,但這種組件知道一些關於UI(因爲它正試圖散發出一天,月&年的元素名稱給客戶端),這讓模型知道一點關於View,我打破了這裏的任何設計原則?
- 在DateTimeClientValidationAttribute,我試圖發出一天,&年元素名稱給客戶端,以便客戶端腳本可以對其進行驗證。但由於模型屬性出生日期是一個子對象,在腳本中的實際元素名稱是MySubObject.DateOfBirth,這使得日文本框的名稱是MySubObject.DateofBirth.Day,我怎麼能找到完全合格模型名稱GetClientValidationRules方法,這樣我就可以把名字發出給客戶端?
感謝您的耐心閱讀了這一切,併爲答案
謝謝!我試圖找出那個問題,正在絞盡腦汁。 – rossisdead 2011-11-17 20:46:52