2013-02-04 58 views
1

是否有一种方法来检查,如果给定的对象在ASP.NET MVC有一个错误4.错误MVC 4视图

@Html.PasswordFor(model => model.Username, new { placeholder = Html.DisplayFor(model => model.Username) }) 
    @if(Html.ErrorFor(model => model.Username)) { 
    <small class="error">@Html.ValidationMessageFor(model => model.Username)</small> 
} 

更新: 它不是模型作为一个整体,但我需要检查的给定元素,所以f.eks。做mode.Username有错误!

+0

您是否尝试过数据注释? http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validation-with-the-data-annotation-validators-cs –

回答

2

我通过创建2个方法解决了这个问题。

public static bool HasErrorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     if (expression == null) 
      throw new ArgumentNullException("expression"); 

     string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); 
     if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) 
      return false; 

     ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; 
     return modelState.Errors.Count > 0; 
    } 
    public static MvcHtmlString GetErrorMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     if (expression == null) 
      throw new ArgumentNullException("expression"); 

     string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); 
     if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) 
      return new MvcHtmlString(null); 

     ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; 
     if (modelState.Errors.Count > 0) 
     { 
      return new MvcHtmlString(modelState.Errors.FirstOrDefault().ErrorMessage); 
     } 

     return new MvcHtmlString(null); 
    } 

以及如何使用它

<div class="row"> 
    <div class="six columns"> 
     @Html.TextBoxFor(model => model.Username, new { placeholder = Html.GetDisplayFor(model => model.Username) }) 
     @if (Html.HasErrorFor(model => model.Username)) 
     { 
     <small class="error">@Html.GetErrorMessageFor(model => model.Username)</small> 
     } 
    </div> 
</div> 
+0

我正在使用ViewData.ModelState.IsValidField(“FieldName”),但我更喜欢你的HasErrorFor扩展方法,它允许我使用类型安全的lambda表达式。 –

+0

非常好。值得多少爱。 – kenchilada

0

使用ModeState.IsValid属性来检查模型

if(ModelState.IsValid) 
{ 
//DO update/insertion/deletion 
} 
else 
{ 
// return your view 
} 

以显示错误的区分有效性。 Read this Post for More Info On ModelState Erro Display

var errors = ModelState 
    .Where(x => x.Value.Errors.Count > 0) 
    .Select(x => new { x.Key, x.Value.Errors }) 
    .ToArray(); 

的特定属性尝试这样ModelState["yourProperty"]。获取包含模型状态和模型绑定验证的模型状态字典对象。

 if (ModelState["yourProperty"].Errors.Count >0) //then error 
+0

为什么downvote?发表评论 –

+0

当你刚刚评论ModelState.IsValid时,我给了他们一个赞成票,因为它表明你没有阅读我的问题,只是看了!我不知道是否因为我使用MVC 4,但我得到的错误“'System.Web.Mvc.ModelState'是'类型',但用于'变量'” – Androme

+0

现在我更新了答案,检查 –