Asp.net mvc 使用asp.net mvc为类生成不引人注目的验证器?

Asp.net mvc 使用asp.net mvc为类生成不引人注目的验证器?,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我想创建一个页面来添加、编辑和删除对象集合。我想用javascript做添加/编辑/删除操作。现在,我有以下HTML: <table class="table table-striped"> <thead> <tr> <td>Name</td> <td>Number</td> <td>Country<

我想创建一个页面来添加、编辑和删除对象集合。我想用javascript做添加/编辑/删除操作。现在,我有以下HTML:

<table class="table table-striped">
    <thead>
        <tr>
            <td>Name</td>
            <td>Number</td>
            <td>Country</td>
            <td></td>
        </tr>
    </thead>
    <tbody>
    @foreach(var n in Model)
    {
        <tr>
            <td class="name">@n.Name</td>
            <td class="value">@n.Value</td>
            <td class="country-name">@n.CountryName</td>
            <td><ahref="#">Edit</a> | <a href="#">Delete</a></td>
        </tr>
    }
    </tbody>
</table>

<div class="modal">
    <form>
        <label>Name</label>
        <input type="text" />
        <label>Value</label>
        <input type="text />
        <button type="submit">Save</button>
    </form>
</div>
是否可以为特定的模型类生成相关的HTML而不引用该类的特定实例?或者我可以使用其他方法吗

一种方法是为模态div使用局部视图。这不需要模型实例

还可以指定EditorFor方法的泛型类型参数并创建新的HtmlHelper。下面的代码段位于MVC3项目模板附带的LogOn.cshtml视图中

@(EditorExtensions.EditorFor<MvcApplication9.Models.RegisterModel, string>(new HtmlHelper<MvcApplication9.Models.RegisterModel>(ViewContext, this), m => m.Email))
@(EditorExtensions.EditorFor(新的HtmlHelper(ViewContext,this),m=>m.Email))
一种方法是为模态div使用局部视图。这不需要模型实例

还可以指定EditorFor方法的泛型类型参数并创建新的HtmlHelper。下面的代码段位于MVC3项目模板附带的LogOn.cshtml视图中

@(EditorExtensions.EditorFor<MvcApplication9.Models.RegisterModel, string>(new HtmlHelper<MvcApplication9.Models.RegisterModel>(ViewContext, this), m => m.Email))
@(EditorExtensions.EditorFor(新的HtmlHelper(ViewContext,this),m=>m.Email))

我决定创建一个方法,手动为输入生成数据val属性。这是:

public static MvcHtmlString DataAttributesFor<TMdl>(Expression<Func<TMdl,object>> exp)
{
    string prop;
    if (exp.Body is UnaryExpression)
        prop = ((exp.Body as UnaryExpression).Operand as MemberExpression).Member.Name;
    else if (exp.Body is MemberExpression)
        prop = (exp.Body as MemberExpression).Member.Name;
    else
        throw new ArgumentException("Given selector expression is unsupported.");


    var attrs = typeof(TMdl).GetProperty(prop).GetCustomAttributes();
    var dict = new Dictionary<string,string>();
    foreach (var elm in attrs)
    {
        if (elm.GetType() == typeof(RequiredAttribute))
            dict.Add("data-val-required", ((RequiredAttribute)elm).FormatErrorMessage(null));
        else if (elm.GetType() == typeof(RegularExpressionAttribute))
        {
            var re = (RegularExpressionAttribute)elm;
            dict.Add("data-val-regex", re.FormatErrorMessage(null));
            dict.Add("data-val-regex-pattern", re.Pattern);
        }
        else if (elm.GetType() == typeof(StringLengthAttribute))
        {
            var sl = (StringLengthAttribute)elm;
            dict.Add("data-val-length", sl.MaximumLength.ToString());
            dict.Add("data-val-length-max", sl.FormatErrorMessage(null));
        }
    }

    if (dict.Count == 0)
        return null;

    var sb = new StringBuilder("data-val='true'");
    foreach (var rr in dict)
        sb.Append(" " + rr.Key + "='" + rr.Value + "'");

    return new MvcHtmlString(sb.ToString());            
}
publicstaticmvchtmlstring数据属性for(Expression)
{
弦道具;
if(exp.Body为一元表达式)
prop=((exp.Body作为一元表达式)。操作数作为MemberExpression)。Member.Name;
else if(exp.Body是MemberExpression)
prop=(exp.Body作为MemberExpression).Member.Name;
其他的
抛出新ArgumentException(“不支持给定的选择器表达式”);
var attrs=typeof(TMdl).GetProperty(prop).GetCustomAttributes();
var dict=新字典();
foreach(属性中的var elm)
{
if(elm.GetType()==typeof(RequiredAttribute))
dict.Add(“需要数据值”,((RequiredAttribute)elm.FormatErrorMessage(null));
else if(elm.GetType()==typeof(RegularExpressionAttribute))
{
var re=(RegularExpressionAttribute)elm;
dict.Add(“数据值正则表达式”,关于FormatErrorMessage(null));
dict.Add(“数据值正则表达式模式”,重模式);
}
else if(elm.GetType()==typeof(StringLengthAttribute))
{
var sl=(StringLengthAttribute)elm;
dict.Add(“数据值长度”,sl.MaximumLength.ToString());
dict.Add(“数据值最大长度”,sl.FormatErrorMessage(null));
}
}
如果(dict.Count==0)
返回null;
var sb=新的StringBuilder(“数据val='true');
foreach(dict中的var rr)
sb.追加(“+rr.Key+”=“+rr.Value+”);
返回新的MvcHtmlString(sb.ToString());
}
您可以这样使用它:

<input data-val="true" data-val-required="This field is required." id="Name"
    name="Name" type="text">
<span class="field-validation-valid" data-valmsg-for="Name"
     data-valmsg-replace="true"></span>
<input id="record-name" type="text" name="record-name"
 @(HtmlExtensions.DataAttributesFor<PhoneNumberVm>(elm => elm.Name))
/>
elm.Name)
/>

该方法不是很健壮,也不适用于所有的数据注释属性,但它可能为某些人提供了一个有用的起点。

我决定创建一个方法,手动为输入生成数据val属性。这是:

public static MvcHtmlString DataAttributesFor<TMdl>(Expression<Func<TMdl,object>> exp)
{
    string prop;
    if (exp.Body is UnaryExpression)
        prop = ((exp.Body as UnaryExpression).Operand as MemberExpression).Member.Name;
    else if (exp.Body is MemberExpression)
        prop = (exp.Body as MemberExpression).Member.Name;
    else
        throw new ArgumentException("Given selector expression is unsupported.");


    var attrs = typeof(TMdl).GetProperty(prop).GetCustomAttributes();
    var dict = new Dictionary<string,string>();
    foreach (var elm in attrs)
    {
        if (elm.GetType() == typeof(RequiredAttribute))
            dict.Add("data-val-required", ((RequiredAttribute)elm).FormatErrorMessage(null));
        else if (elm.GetType() == typeof(RegularExpressionAttribute))
        {
            var re = (RegularExpressionAttribute)elm;
            dict.Add("data-val-regex", re.FormatErrorMessage(null));
            dict.Add("data-val-regex-pattern", re.Pattern);
        }
        else if (elm.GetType() == typeof(StringLengthAttribute))
        {
            var sl = (StringLengthAttribute)elm;
            dict.Add("data-val-length", sl.MaximumLength.ToString());
            dict.Add("data-val-length-max", sl.FormatErrorMessage(null));
        }
    }

    if (dict.Count == 0)
        return null;

    var sb = new StringBuilder("data-val='true'");
    foreach (var rr in dict)
        sb.Append(" " + rr.Key + "='" + rr.Value + "'");

    return new MvcHtmlString(sb.ToString());            
}
publicstaticmvchtmlstring数据属性for(Expression)
{
弦道具;
if(exp.Body为一元表达式)
prop=((exp.Body作为一元表达式)。操作数作为MemberExpression)。Member.Name;
else if(exp.Body是MemberExpression)
prop=(exp.Body作为MemberExpression).Member.Name;
其他的
抛出新ArgumentException(“不支持给定的选择器表达式”);
var attrs=typeof(TMdl).GetProperty(prop).GetCustomAttributes();
var dict=新字典();
foreach(属性中的var elm)
{
if(elm.GetType()==typeof(RequiredAttribute))
dict.Add(“需要数据值”,((RequiredAttribute)elm.FormatErrorMessage(null));
else if(elm.GetType()==typeof(RegularExpressionAttribute))
{
var re=(RegularExpressionAttribute)elm;
dict.Add(“数据值正则表达式”,关于FormatErrorMessage(null));
dict.Add(“数据值正则表达式模式”,重模式);
}
else if(elm.GetType()==typeof(StringLengthAttribute))
{
var sl=(StringLengthAttribute)elm;
dict.Add(“数据值长度”,sl.MaximumLength.ToString());
dict.Add(“数据值最大长度”,sl.FormatErrorMessage(null));
}
}
如果(dict.Count==0)
返回null;
var sb=新的StringBuilder(“数据val='true');
foreach(dict中的var rr)
sb.追加(“+rr.Key+”=“+rr.Value+”);
返回新的MvcHtmlString(sb.ToString());
}
您可以这样使用它:

<input data-val="true" data-val-required="This field is required." id="Name"
    name="Name" type="text">
<span class="field-validation-valid" data-valmsg-for="Name"
     data-valmsg-replace="true"></span>
<input id="record-name" type="text" name="record-name"
 @(HtmlExtensions.DataAttributesFor<PhoneNumberVm>(elm => elm.Name))
/>
elm.Name)
/>
该方法不是很健壮,并且不适用于所有的数据注释属性,但它可能为某些人提供了一个有用的起点