在IE和Chrome的MVC中禁用自动填充

时间:2018-10-29 17:06:16

标签: asp.net-mvc autocomplete

我有我的login.cshtml页面,其中密码文本框显示了自动完成选项,我需要禁用此选项。下面是我的代码。

<div id="login">
    @using (Html.BeginForm(MVC.Account.Login())) {

        <div>@Html.ValidationSummary(true)</div>

        <div>@Html.LabelledTextBoxFor(m => m.Username)</div>
        <div>@Html.LabelledPasswordFor(m => m.Password)</div>
    }
</div>

如何禁用在IE和Chrome浏览器中都可以使用的自动完成选项?

如果我在下面的代码中使用该代码,那么我将收到错误消息,即“无重载方法LabelledPasswordFor带有2个参数”。

@Html.LabelledPasswordFor(m => m.Password, new { autocomplete = "off" })

public static MvcHtmlString LabelledPasswordFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var displayName = html.RawDisplayNameFor(expression);
    var editor = html.PasswordFor(expression, metadata.IsRequired ? (object)new { placeholder = displayName, @class = "requiredInput" } : new { placeholder = displayName });
    var validator = html.ValidationMessageFor(expression);
    return new MvcHtmlString(editor.ToHtmlString() + validator.ToHtmlString());
    }

2 个答案:

答案 0 :(得分:1)

由于LabelledPasswordFor是您自己的实现,因此您应该可以对其进行更改以也支持autocomplete。下面是一个示例。

我选择使用true/false来调用它,然后将其翻译为"on" / "new-password",这样,属性的确切细节就不再与调用者有关。

public static MvcHtmlString LabelledPasswordFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression,
    bool autocomplete = true)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var displayName = html.RawDisplayNameFor(expression);

    var htmlAttr = new Dictionary<string, object>();
    htmlAttr.Add("placeholder", displayName);
    htmlAttr.Add("autocomplete", autocomplete ? "on" : "new-password");
    htmlAttr.Add("class", metadata.IsRequired ? "requiredInput" : "");
    var editor = html.PasswordFor(expression, htmlAttr);

    var validator = html.ValidationMessageFor(expression);
    return new MvcHtmlString(editor.ToHtmlString() + validator.ToHtmlString());
}

用法:

<div>@Html.LabelledPasswordFor(m => m.Password, autocomplete: false)</div>

答案 1 :(得分:0)

将HTML的输入元素自动完成属性设置为“关”值应防止自动完成:

@Html.LabelledPasswordFor(m => m.Password, new { autocomplete = "off" })

顺便说一句,您可以使用

禁用整个表单的自动填充功能(表单内的所有输入都会受到影响)
Html.BeginForm(action, controller, FormMethod.Post, new { autocomplete="off"})