【问题标题】:Error in MVC 4 viewMVC 4 视图中的错误
【发布时间】:2013-02-04 16:27:43
【问题描述】:

有没有办法检查给定对象在 ASP.NET 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。 do mode.Username有错误!

【问题讨论】:

标签: asp.net asp.net-mvc-4


【解决方案1】:

我通过创建 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>

【讨论】:

  • 我使用的是 ViewData.ModelState.IsValidField("FieldName"),但我更喜欢您的 HasErrorFor 扩展方法,它允许我使用类型安全的 lambda 表达式。
  • 非常好。值得爱。
【解决方案2】:

使用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

【讨论】:

  • 当您刚刚评论 ModelState.IsValid 时,我投了反对票,因为这表明您没有阅读我的问题,只是回答了!我不知道是不是因为我使用的是 MVC 4,但我收到错误“'System.Web.Mvc.ModelState' is a 'type' but is used like a 'variable'”
猜你喜欢
  • 2014-11-13
  • 2013-12-15
  • 2021-07-29
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多