3

我在ASP.NET MVC 3/Razor中使用客戶端驗證(不顯眼)我通過使用Html.EditorFor和指定DataType.MultilineText來獲得它在<textarea>上的工作,但不應該Html.TextAreaFor也有客戶端驗證?Html.TextBoxFor/Html.TextAreaFor和Html.EditorFor(與[DataType(DataType.MultilineText)]之間的客戶端驗證區別

[Required(ErrorMessage = "Foo")] 
public string Message { get; set; } 

// Does add client-side validation 
@Html.TextBoxFor(m => m.Message) 

// Does NOT add client-side validation 
@Html.TextAreaFor(m => m.Message) 

[Required(ErrorMessage = "Foo")] 
[DataType(DataType.MultilineText)] 
public string Message { get; set; } 

// Does add client-side validation (and multiline) 
@Html.EditorFor(m => m.Message) 

// Does NOT add client-side validation 
@Html.TextAreaFor(m => m.Message) 

<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

回答

8

你上面的例子正常工作對我。我想知道 - 這是一個確切的例子,還是從現實世界的問題簡化了?在使用具有嵌套屬性的模型時,我發現了這種確切的行爲。

因此,舉例來說,如果我改變你的模型看起來像這樣:

public class MyModelObject 
{ 
    [Required(ErrorMessage = "Foo")] 
    [DataType(DataType.MultilineText)] 
    public string Message { get; set; } 
} 

public class MyModel 
{ 
    public MyModelObject MyObject { get; set; } 
} 

然後我複製你提到的具體問題。

@Html.EditorFor(x => x.MyObject.Message) 

產生預期的jQuery驗證屬性:

<textarea class="text-box multi-line input-validation-error" data-val="true" data-val-required="Foo" id="MyObject_Message" name="MyObject.Message"></textarea> 

但是,這樣的:

@Html.TextAreaFor(x => x.MyObject.Message) 

並不:

<textarea cols="20" id="MyObject_Message" name="MyObject.Message" rows="2"></textarea> 

如果這樣做實際上是描述你的問題,它看起來像這樣已報告的錯誤: http://aspnet.codeplex.com/workitem/8576

0

由於obliojoe在他的回答表明,當表達不僅僅是一個簡單的屬性引用更復雜的出現這個錯誤。

我已經實現瞭解決此問題的替換助手。關鍵是要得到正確的模型的元數據,將它傳遞給HtmlHelper.GetUnobtrusiveValidationAttributes(),然後將所接收的屬性的原始TextAreaFor()助手:

public static MvcHtmlString TextAreaWithValidationFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
{ 
    var modelMetadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    var name = ExpressionHelper.GetExpressionText(expression); 
    IDictionary<string, object> validationAttributes = helper.GetUnobtrusiveValidationAttributes(name, modelMetadata); 
    return TextAreaExtensions.TextAreaFor(helper, expression, validationAttributes); 
} 

我附着更發達的版本(這提供了所有TextAreaFor過載,包括那些具有htmlAttributes)此代碼的bug reported on CodePlex

相關問題