![](/img/trans.png)
[英]Html.TextBoxFor formatting or Html.EditorFor htmlAttributes?
[英]Client-side validation difference between Html.TextBoxFor/Html.TextAreaFor and Html.EditorFor (with [DataType(DataType.MultilineText)])
我在ASP.NET MVC 3 / Razor中使用客戶端驗證(不引人注意)我通過使用Html.EditorFor並指定DataType.MultilineText讓它在<textarea>
上工作,但不應該Html.TextAreaFor也有客戶端 -邊驗證?
[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" />
你上面的例子對我來說很好。 我想知道 - 這是一個精確的例子,還是從現實世界的問題中簡化了? 在使用具有嵌套屬性的模型時,我發現了這種確切的行為。
因此,例如,如果我將模型更改為如下所示:
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
正如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);
}
我將此代碼的更htmlAttributes
版本(提供所有TextAreaFor
重載,包括那些帶有htmlAttributes
) htmlAttributes
到CodePlex上報告的錯誤 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.