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

时间:2015-12-09 17:19:36

标签: c# asp.net-mvc razor asp.net-mvc-5

所以,有很多关于制作自定义数据验证器的例子,但我需要的是一个Data Annotation,它只是为最终标记添加一个属性。我的google-fu今天一定很弱。基本想法是:

Model.cs

[SomeCustomAttribute]
public int CoolProperty {get;set}

View.cshtml

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

然后,神奇的巫术在这里发生:

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

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

<input type="text" CustomAttribute>

显然它会更复杂,但这是它的要点。我知道我可以在视图中查看它,但我将在整个地方重用这个特定的逻辑,似乎应该有一些方法来做到这一点。类似于Display属性的东西。

如果还有另一种我缺失的方法,我也是为了这一切。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

@model int

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

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

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

你应该得到一个输入类型=文本,其属性为 class = someClass和maxlength = 5

答案 1 :(得分:0)

这也可能是自定义HTML Helper方法的理想选择 - 这将允许您在应用程序的其他区域重用它。这就是我模仿标准ActionLink方法的做法;我允许我指定bootstrap glyphicon类。

  1. 创建一个静态类来保存你的html帮助器方法;我的名字叫HtmlHelpers

  2. 在此类中,定义并实现一个封装所需逻辑的静态方法。我调用了我的方法BootstrapActionLink。由于这是一种扩展方法,因此第一个参数必须为this HtmlHelper parameterName

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

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

  5. 下面是我使用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>