为什么Html.HiddenFor生成data-val-属性

Rud*_*udi 7 validation asp.net-mvc-3 html.hiddenfor

标准输出@Html.HiddenFor(model => model.Id)

<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="0" />
Run Code Online (Sandbox Code Playgroud)

是否需要生成data-val-*属性?它们看起来相当冗长,并且不需要能够存储和返回下一个POST的数据.

禁用这些属性是个好主意吗?它们对某些场景有用吗?

ps:目前我有办法通过临时设置禁用它们 ViewContext.UnobtrusiveJavaScriptEnabled = false

使用这两个类:

public static class Extensions
{
    public static NoUnobtrusiveJavaScript NoUnobtrusiveJavaScript(this HtmlHelper htmlHelper)
    {
        return new NoUnobtrusiveJavaScript(htmlHelper.ViewContext);
    }
}

public class NoUnobtrusiveJavaScript: IDisposable
{

    private bool _disposed;
    private readonly bool _unobtrusiveJavaScript;
    private readonly ViewContext _viewContext;

    public NoUnobtrusiveJavaScript(ViewContext viewContext)
    {
        if (viewContext == null) {
            throw new ArgumentNullException("viewContext");
        }

        _viewContext = viewContext;
        _unobtrusiveJavaScript = viewContext.UnobtrusiveJavaScriptEnabled;
        _viewContext.UnobtrusiveJavaScriptEnabled = false;
    }

    public void Dispose()
    {
        Dispose(true /* disposing */);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            _disposed = true;
            // restore the original UnobtrusiveJavaScriptEnabled state
            if (_viewContext != null)
            {
                _viewContext.UnobtrusiveJavaScriptEnabled = _unobtrusiveJavaScript;
            }
        }
    }

    public void EndForm()
    {
        Dispose(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

*模式遵循FormExtensions.csMvcForm.cs中的Html.BeginForm代码

Jon*_*ood 1

仅仅因为该字段是隐藏的,并不一定意味着您不需要验证。您可能正在通过 JavaScript 操作隐藏字段,并且希望保留内置验证,这样您就不必自己进行验证。