我目前正在使用@Html.EditorFor HTML helper作为密码字段.我想改用@Html.PasswordFor HTML助手.

我复制了当前代码,并将@Html.EditorFor替换为@Html.PasswordFor.

CSHTML

代码如下:

@Html.EditorFor(x => x.Password, new { htmlAttributes = new { @class = "form-control k-textbox large", placeholder = "password", @id = "password", @autocomplete = "off" } })

@Html.PasswordFor(x => x.Pwd, new { htmlAttributes = new { @class = "form-control k-textbox large", placeholder = "password", @id = "password", @autocomplete = "off" } })

渲染输出

这些参数完全相同,但会生成不同样式的文本框:

enter image description here

注意,@Html.EditorFor有验证和占位符,但@Html.PasswordFor没有;后者也有不同的风格.validation spam元素也不是textbox的一部分.

生成的HTML

以下是为@Html.EditorFor生成的HTML代码:

<input autocomplete="off" class="form-control k-textbox large text-box single-line password k-invalid" data-val="true" data-val-required=" " id="password" name="Password" placeholder="password" type="password" value="" aria-invalid="true"> 

以下是为@Html.PasswordFor生成的HTML代码:

<input data-val="true" data-val-required=" " htmlattributes="{ class = form-control k-textbox large, placeholder = password, id = password, autocomplete = off }" id="Pwd" name="Pwd" type="password" aria-invalid="true" class="k-invalid">

模型定义

这就是我在模型中定义这两个字段的方式:

[Required(ErrorMessage = " ")]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required(ErrorMessage = " ")]
[DataType(DataType.Password)]
public string Pwd { get; set; }

我做错了什么?

推荐答案

我不能告诉您why决定以不同的方式对待这些对象,但尽管这些特定重载的第二个参数EditorFor()PasswordFor()都接受匿名对象,但这些对象实际上代表不同的概念.

文档

对于EditorFor(),第二个参数标题为additionalViewData:

可以包含其他视图数据的匿名对象,这些数据将合并到为模板创建的ViewDataDictionary<TModel>实例中.

对于PasswordFor(),第二个参数标题为htmlAttributes:

包含要为元素设置的HTML属性的对象.

解释

换言之,您在这里的操作处于不同的级别.当您在匿名对象上为EditorFor()(即additionalViewData)设置一个名为htmlAttributes的属性时,该属性将被解析为渲染元素上的HTML属性:

<input autocomplete="off" class="…" id="password" placeholder="password" … > 

但是,当您在匿名对象上为PasswordFor()设置htmlAttributes(即htmlAttributes)时,这被视为HTML属性本身,正如您在HTML输出中所看到的:

<input htmlattributes="{ class = …, placeholder = password, id = password, autocomplete = off }" … >

决议

因此,您在PasswordFor()通话中将htmlAttributes提高一个级别时所做的是:

@Html.PasswordFor(x => x.Pwd, new { @class = "form-control k-textbox large", placeholder = "password", @id = "password", @autocomplete = "off" })

其中should个渲染如下:

<input class="form-control k-textbox large" placeholder="password" id="password" autocomplete="off" … >

正确设置CSS类后,您还应该发现演示文稿是一致的.

Asp.net相关问答推荐

在Docker Windows中,ASP.NET核心容器在自定义端口8080上运行,但ASP.NET容器在固定端口80上运行

分层架构中的 ASP.NET 和实体框架 - 仅将实体框架用于 ORM

在每页级别增加 ASP.Net 超时

登录成功后 User.Identity.IsAuthenticated 为 false

如何使用 jQuery 设置 outerHTML

如何在txt文件中保存异常?

使用 Lucene.NET 索引 .PDF、.XLS、.DOC、.PPT

'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册.

如何在 ASP.Net Core Razor 页面上重定向

Ef core:执行 MaxAsync 时序列不包含任何元素

尽管安装了 AspNetCoreModule,但在 IIS 中运行 ASP.NET Core 应用程序时出现 0x8007000d 错误 500.19

如何从后面的 ASP.NET 代码访问 HTML 表单输入

在 Android/Java 和 C# 中计算 SHA256 哈希

在 ASP.NET MVC 中模拟 User.Identity

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序

解耦 ASP.NET MVC 5 标识以允许实现分层应用程序

您可以从 web.config 文件中的其他位置提取 log4net AdoNetAppender 的 connectionString 吗?

如何在不遍历每个循环的情况下从字典对象中获取所有键(仅键)

如何识别字符串是否包含 unicode 字符?

禁用文本框的模型绑定