Asp.net mvc4 EditorTemplates

EditorTemplates 对应 @Html.EditorFor

通常 @Html.EditorFor 的用法如下@Html.EditorFor(m => m.UserName) 假如UserName是string的话 那就默认生成一个textbox

对于默认情况下,在model中如果校验失败,则会在textbox会添加 error 的class。而且@Html.ValidationMessageFor(m => m)这样的也是会有默认的式样。

假如不需要默认的式样,那么就要重写EditorTemplates了。

方法是在view/Shared/EditorTemplates/目录下添加对应的cshtml文件,当然ascx也是可以的。

来个例子

如果UserName是string

那么添加的文件就是string.cshtml

@model string  
@{
    
    ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName];
 
    if (state != null && state.Errors.Count > 0)
    {
        <div class="control-group error">
            <label class="control-label" for="@ViewData.ModelMetadata.PropertyName">@ViewData.ModelMetadata.DisplayName</label>
            <div class="controls">
                @Html.PasswordFor(m => m) 
                <span class="help-inline">@Html.ValidationMessageFor(m => m)</span>
            </div>
        </div>
    }
    else
    {
        <div class="control-group">
            <label class="control-label" for="@ViewData.ModelMetadata.PropertyName">@ViewData.ModelMetadata.DisplayName</label>
            <div class="controls">
                @Html.PasswordFor(m => m) 
            </div>
        </div>
    }
}

上面这样的可以解决一些比较简单的类型。

对于Email这类,如果声明是下面这样的

 [Required]
        [Display(Name = "邮箱")]
        [EmailAddress]
        public string Email { get; set; }

虽然Email是string 但是如果期望该Email使用string.cshtml的话,那是不行的。具体原因可能要反汇编.net库才知道了。如果有知道的话,也请留言。

有个变通的方法就是使用UIHINT

[Required]
        [Display(Name = "邮箱")]
        [EmailAddress]
        [UIHint("string")]
        public string Email { get; set; }

声明成这样 就会使用string.cshtml了

 

posted on 2013-03-20 21:42  leonworld2011  阅读(1354)  评论(0)    收藏  举报

导航