簡體   English   中英

Html.TextBoxFor / Html.TextAreaFor和Html.EditorFor(與[DataType(DataType.MultilineText)])之間的客戶端驗證差異

[英]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重載,包括那些帶有htmlAttributeshtmlAttributesCodePlex上報告錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM