在单个(已禁用)@Html.EditorFor 上禁用验证

Posted

技术标签:

【中文标题】在单个(已禁用)@Html.EditorFor 上禁用验证【英文标题】:Disable Validation on a single (disabled) @Html.EditorFor 【发布时间】:2020-04-29 14:58:26 【问题描述】:

我读到过,这样做的给定方式似乎是为不同的动作/控制器提供不同的视图模型(这有点过分了 imo)。

我以为

@html.EditorFor(model => model.Ingredient.Name, new  htmlAttributes = new  @class = "form-control", disabled = "disabled", data_val = "false" )

可能有效,但不幸的是没有。

有人有什么想法吗?

【问题讨论】:

这里的主要问题是:您希望禁用该元素的验证,还是希望将该项目设为只读? @Tom B. 如果可能的话。两者同等重要。 ASP .NET MVC Disable Client Side Validation at Per-Field Level的可能重复 【参考方案1】:

在将元素声明为禁用时,MVC 可能会很有趣。我使用 readonly 来解决这个问题。只需将 disabled 更改为 readonly ,如下所示。

@Html.EditorFor(model => model.Ingredient.Name, new  htmlAttributes = new  @class = "form-control", readonly= "readonly", data_val = "false" )

或者另一种方法是使用输入 html 元素

<input type="text" name="Ingredient.Name" id="Ingredient_Name" readonly="readonly" class="form-control, input-disabled" />

添加css类

.input-disabled /* CHANGE STYLING OF READONLY FIELDS */

    background-color: #EEEEEE;    

然后将你的类添加到你的 html 中

@Html.EditorFor(model => model.Ingredient.Name, new  htmlAttributes = new  @class = "form-control, input-disabled", readonly= "readonly", data_val = "false" )

我创建了以下内容以向您展示jsfiddle

【讨论】:

A 只读编辑器不再是编辑器了。为了“更正确”,我应该提出一个显示模板。 如果不需要是 EditorFor 则改为 TextBoxFor 并设置 @readonly = "readonly" 即可 Rory 你到底想用这个元素做什么? @Scanner。它是一个编辑视图。元素是成分的标题/名称。我想像表格的其余部分一样显示它,但显示为灰色。没什么大不了的,我可以将其显示为标签。我只是认为有一种简单的方法可以排除对属性的验证 @rory,那么你只需要css。查看我的更新编辑【参考方案2】:

您可以使用.ignore 对一个或多个元素启用客户端验证。

这样做的好处是它是通用的,只需添加使用的忽略类即可应用于多个元素。

在你的 jquery 代码中添加这个

$.validator.setDefaults(
    ignore: ".ignore"
);

在您希望忽略/禁用客户端验证的每个元素上应用忽略类。

@Html.EditorFor(model => model.Ingredient.Name, new  htmlAttributes = new  @class = "form-control ignore", disabled = "disabled", data_val = "false" )

【讨论】:

很好的解决方案。值得注意的是,默认值为ignore: ":hidden",因此您可能不想完全覆盖它。您可能可以设置为 `":hidden,.ignore" 来忽略两者,尽管我还没有测试过。 为我工作。很好的建议【参考方案3】:

所有不显眼的验证(ASP.NET MVC 使用的那种)都基于查找和解析每个对象上的data 属性。这些包含验证引擎运行所需的所有信息,并且仅包含具有data-val="true" 的元素。

您传递的任何 HTML 属性都将覆盖任何默认属性,因此最简单的方法是强制 data-val="false" 并且表单元素不会包含在验证引擎中,并且不会解析任何其他相关标签.

这是来自ASP .NET MVC Disable Client Side Validation at Per-Field Level 的示例:

@Html.TextBoxFor(m => m.BatchId, new  data_val = "false" )

【讨论】:

【参考方案4】:

您可以在渲染字段之前在 Razor 视图中禁用客户端验证并重新启用。我相信您的问题已经得到解答here

【讨论】:

我试过这个,但错误在 db.SaveChanges();

以上是关于在单个(已禁用)@Html.EditorFor 上禁用验证的主要内容,如果未能解决你的问题,请参考以下文章

EditorFor() 和 html 属性

如何获取 Html.Editorfor 的日期选择器

c# mvc 表单:如何利用使用 html.editorfor 的好处为简单的反馈表单构建视图?

MVC5 @Html.EditorFor:第二个属性问题

如何在 Html.EditorFor 中使用占位符属性?

在 MVC 2 中将 css 类添加到 Html.EditorFor