MVC3:为什么我的ModelError不会传播到我的视图?

时间:2011-09-02 00:40:20

标签: asp.net-mvc-3 validation

我正在研究.NET MVC3应用程序。当我在控制器中出现错误时,错误永远不会在我的视图中结束。为什么呢?

我的行动方法如下:

[HttpPost]
public ActionResult Create(UserProfile model)
{
    if ( !ModelState.IsValid )
    {
        return View(model);
    }

    try
    {
        DependencyResolver.Current.GetService<IUserProfileService>().CreateUser(
            model.Email,      /* mapped to UserName param; we use email addy as the username */
            model.Password,
            model.Email,
            model.FirstName,
            model.LastName,
            model.Phone,
            model.Fax,
            model.RememberMe);
    }
    catch ( Exception ex )
    {
        ViewData.ModelState.AddModelError( string.Empty, ex );
        return View(model);
    }

    return RedirectToAction(Actions.Subscriptions);
}

我的观点很无聊:

...
@using (Html.BeginForm())
{   
    @Html.ValidationSummary( true )
    <div>
        <div class="row">
            <label>@Html.LabelFor(m => m.FirstName)</label>
            @Html.TextBoxFor(m => m.FirstName)
            @Html.ValidationMessageFor( m => m.FirstName )
        </div>
        <div class="row">
            <label>@Html.LabelFor(m => m.LastName)</label>
            @Html.TextBoxFor(m => m.LastName)
            @Html.ValidationMessageFor( m => m.LastName )
        </div>
    ... etc. ...
    </div>
}

如果我为已经使用其用户名的人发布表单(例如,用于用户名的电子邮件与用于电子邮件地址的电子邮件不同的旧数据),CreateUser()调用将抛出异常:

System.ApplicationException was caught
  Message=Error Creating User: User already exists

然后我们进入catch块,将错误添加到ModelState集合,并返回视图。到目前为止,非常好 - 检查ModelState显示集合中第10个元素的错误(前9个元素映射到单个模型属性)。

但我的观点从未显示错误!我希望它出现在我调用@Html.ValidationSummary()的地方,但那里只有一个空元素:

<div class="validation-summary-errors"><ul><li style="display:none"></li></ul></div>

无论我是将true还是false传递给@Html.ValidationSummary(),还是在添加到ModelState集合时是否命名错误来源,都会发生这种情况:

ViewData.ModelState.AddModelError( string.Empty, ex );
ViewData.ModelState.AddModelError( "UserName", ex );

因此,用户发布表单,它被拒绝,并且它只是重新显示而没有错误消息,因此不知道如何解决问题。

所以,我试图找出为什么我的错误没有传播回视图。并且,我想拦截错误消息并使其更加明确,因此我们所讨论的“用户”显然是他们在表单上输入的电子邮件。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:4)

好的,我终于找到了问题:AddModelError()方法有两个重载,一个采用Exception,另一个采用字符串。当我通过整个例外时:

ViewData.ModelState.AddModelError( string.Empty, ex );

,我在ValidationSummary中没有呈现错误。当我传递异常的消息字符串时:

ViewData.ModelState.AddModelError( string.Empty, ex.Message );

错误消息正确呈现。

现在回到我们定期安排的节目。

答案 1 :(得分:1)

我认为在添加模型错误时必须完全匹配属性名称。我没有看到一个用户名?

确保所有验证消息都有效

  1. 在web.config中设置标志:
  2. 包含对jQuery库的引用〜/ Scripts / jquery-1.4.4.js
  3. 在〜/ Scripts / jquery.unobtrusive-ajax.js
  4. 中包含一个引用该魔术的库的引用
  5. 确保您的模型在字段上具有[Required()]属性,以便您可以测试验证(默认情况下需要非可空整数字段且不需要属性)