Asp.net mvc 为IE&;禁用MVC中的自动完成;铬

Asp.net mvc 为IE&;禁用MVC中的自动完成;铬,asp.net-mvc,autocomplete,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.Usernam

我有我的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>

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

@Html.LabelledPasswordFor(m => m.Password, new { autocomplete = "off" })
顺便说一句,您可以使用禁用整个表单的自动完成功能(表单内的所有输入都将受到影响)


由于
LabelledPasswordFor
是您自己的实现,因此您应该能够将其更改为也支持
自动完成
。下面是一个例子

我选择使用
true/false
来调用它,然后在“/”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());
}

public static MvcHtmlString LabelledPasswordFor(
这个HtmlHelper html,
表情表情,
bool autocomplete=true)
{
var metadata=modelmetada.FromLambdaExpression(表达式,html.ViewData);
var displayName=html.RawDisplayNameFor(表达式);
var htmlAttr=新字典();
添加(“占位符”,显示名称);
htmlAttr.Add(“自动完成”,自动完成?:“新密码”);
htmlAttr.Add(“class”,metadata.IsRequired?“requiredInput”:“”);
var editor=html.PasswordFor(表达式,htmlAttr);
var validator=html.ValidationMessageFor(表达式);
返回新的MvcHtmlString(editor.ToHtmlString()+validator.ToHtmlString());
}
用法:

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

标签Passwordfor是什么?这是来自第三方库还是自定义库的函数?欢迎使用!我建议您将代码包装成代码格式,以便更容易阅读。请参见,看起来
LabelledPasswordFor
不是ASP.NET MVC提供的内置方法。如果您提供指向其公共文档的链接(或者更好:它支持的所有重载),那么我们可能会提供帮助。否则我担心它会有问题。public static MvcHtmlString LabelledPasswordFor(此HtmlHelper html,表达式表达式){var metadata=ModelMetadata.FromLambdaExpression(表达式,html.ViewData);var displayName=html.RawDisplayNameFor(表达式);var editor=html.PasswordFor(表达式,metadata.IsRequired?(对象)新建{placeholder=displayName,@class=“requiredInput”}:新建{placeholder=displayName});var validator=html.ValidationMessageFor(表达式);返回新的MvcHtmlString(editor.ToHtmlString()+validator.ToHtmlString());}@PeterB-请查找labelledPasswordFor的方法。谢谢,谢谢。但这给了我一个错误,即方法“LabelledPasswordFor”没有重载需要2个参数。如果您自定义实现LabelledPasswordFor,请参阅@Peter B的答案。起初我认为LabeledPasswordFor只是用相同或扩展的签名包装了标准MVC的PasswordFor实现。它现在给了我一个标签,如下所示,但自动完成仍然会发生,尽管是“关闭”看到我的更新,结果是Chrome需要“新密码”来防止密码自动填充。希望其他浏览器也同意…谢谢。此“新密码”在chrome中有效,但在IE中无效:(
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>