MVC自定义模型注释未经验证

本文关键字:验证 注释 自定义 模型 MVC | 更新日期: 2023-09-27 18:26:13

因此,有很多制作自定义数据验证器的例子,但我需要的是一个数据注释,它只会在最终标记中添加一个属性。我的谷歌功夫今天一定很弱。基本想法是:

型号.cs

[SomeCustomAttribute]
public int CoolProperty {get;set}

查看.cshtml

@Html.EditorFor(q => q.CoolProperty)

然后,神奇的魔法随之而来:

public class SomeCustomAttribute : SomeAwesomeClassToInheritThatICantFind {
  public override void AddAttributes() {
     AddAttribute("CustomAttribute");
  }
}

最后,我希望标记呈现为:

<input type="text" CustomAttribute>

很明显,这会更复杂,但这就是它的要点。我知道我可以把它放在一边,但我会在所有地方重复使用这个特定的逻辑,似乎应该有一些方法来做到这一点。类似于"显示"属性的内容。

如果我缺少另一种方法,我也完全支持。

MVC自定义模型注释未经验证

这也可能是自定义HTML Helper方法的一个很好的候选者,这将允许您在应用程序的其他领域中重用它。这就是我模仿标准ActionLink方法所做的;我的允许我指定引导程序字形类。

  1. 创建一个静态类来容纳您的html助手方法;我的名字叫CCD_ 2。

  2. 在这个类中,定义并实现一个封装所需逻辑的静态方法。我将我的方法称为BootstrapActionLink。因为这是一个扩展方法,所以第一个参数需要是this HtmlHelper parameterName

  3. 由于您希望在应用程序的不同区域中重用,因此需要将类名称空间(步骤1)添加到位于~/Views文件夹中的web.config文件中(而不是顶层web.config)。

  4. 现在,您可以在任何视图中使用HTML助手方法。

下面是我使用TagBuilder类的助手方法代码:

public static MvcHtmlString BootstrapActionLink(this HtmlHelper htmlHelper, string linkText, string linkUrl, string bootstrapClasses, string glyphClasses)
{
    TagBuilder anchor = new TagBuilder("a");
    anchor.MergeAttribute("href", linkUrl);
    anchor.AddCssClass(bootstrapClasses);
    TagBuilder span = new TagBuilder("span");
    span.AddCssClass(glyphClasses);
    anchor.InnerHtml = linkText + " " + span.ToString();
    return MvcHtmlString.Create(anchor.ToString());
}

~/Views/Web.config内部,我有

<system.web.webPages.razor>
    ...
    <namespaces>
        <add namespace="ApplicationName.NamespaceName"/>

在我看来,我使用以下代码

@Html.BootstrapActionLink("Add Account", @Url.Action("Add", new { employeeId = @Model.EmployeeId.Trim() }), "btn btn-primary", "glyphicon glyphicon-plus")

生成的输出如下所示:

<a class="btn btn-primary" href="/myapplication/Add/123456">Add Account <span class="glyphicon glyphicon-plus"></span></a>

您可以使用自定义编辑器模板:

1) 创建文件夹/Views/Shared/EditorTemplates

2) 在此文件夹中创建文件SomeCustomAttributes.cshtml

3) 在模板文件中,您必须指定可以应用模板的类型和规则(添加一个具有class和maxlength两个属性的@Html.TextBox):

@model int
@Html.TextBox("", (Model), new { @class = "someClass" , maxlength="5"})

4) 最后,使用UIHint属性指定自定义模板:

[UIHint("SomeCustomAttributes")]
public int CoolProperty {get;set}

您应该得到一个输入类型=text,属性class=someClass,maxlength=5