尽管向 ModelState 添加了消息,但 Html.ValidationMessage 为空

Posted

技术标签:

【中文标题】尽管向 ModelState 添加了消息,但 Html.ValidationMessage 为空【英文标题】:Html.ValidationMessage is empty despite message added to ModelState 【发布时间】:2014-06-21 11:25:42 【问题描述】:

我正在尝试同时使用 ModelState.AddErrrorModelhtml.ValidationMessage("Account") 来显示错误消息。

但是,即使我可以调试在我的 POST 中添加的模型错误,当再次加载视图时,我也无法在视图中看到它。

代码在表单的 POST 上运行,我可以看到 ModelState.AddModelError 正在被调用(ex.Message 也有一个值):

            try 
               // code that fails in this case
            
            catch (Exception ex)
            
                logger.Error(ex);
                ModelState.AddModelError("Register",ex.Message);
            

            return RedirectToAction("Account", accountViewModel);

我的观点是这样的:

 <h3>Get your free account now</h3>
        @using (Html.BeginForm("Register", "Home", FormMethod.Post, new  @class = "form" ))
        
            // trying to test different methods to get my errors... NOTHING works :)
            @Html.ValidationSummary()
            @Html.ValidationMessage("Register")
            @Html.BusinessErrorMessageBox()


            <div class="form-group">
                <label>Email address</label>
                @Html.TextBoxFor(m => m.RegisterViewModel.Email, new  @class = "form-control", placeholder = "Email", @type = "email" )
                @Html.ValidationMessageFor(m => m.RegisterViewModel.Email)
            </div>
            <div class="form-group">
                <label>Password</label>
                @Html.PasswordFor(m => m.RegisterViewModel.Password, new  @class = "form-control", placeholder = "Password" )
                @Html.ValidationMessageFor(m => m.RegisterViewModel.Password)
            </div>
            <div class="form-group">
                <label>Your country (the country where you live or where your organization is registered in)</label>
                @Html.DropDownListFor(model => model.RegisterViewModel.SelectedCountry, Model.RegisterViewModel.Countries, new  @class = "form-control" )
            </div>
            <input type="submit" class="btn btn-primary btn-lg" value="Get your free account now" />
        

出于实际原因,我的视图称为Account,而接受POST的方法称为“Register”。

但无论我做什么,ValidationMessageValidationSummary 中都没有显示错误。

知道我做错了什么吗?

编辑

仅供参考:视图中有两种形式,如果这可能会产生影响的话。

编辑 2

单击转到我的服务器的按钮时,我可以看到正在输出以下 HTML。值ex.Message,无处显示:

<div class="validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
</ul></div><span class="field-validation-valid" data-valmsg-for="Business" data-valmsg-replace="true"></span><span class="field-validation-valid" data-valmsg-for="Register" data-valmsg-replace="true"></span>     

【问题讨论】:

你试过ModelState.AddModelError(string.Empty ,ex.Message);@Html.ValidationSummary(true) 刚试过。不幸的是,这没有帮助。仅供参考 - 页面上还有 2 个表格 【参考方案1】:

您的 POST 操作的结果始终是重定向:

return RedirectToAction("Account", accountViewModel);

这意味着您的错误消息将丢失,因为重定向会告诉浏览器为Account 操作发送另一个 GET 请求,您将在其中呈现一个没有错误的全新 Register 视图。

你想要的流程是:

POST逻辑成功,返回一个重定向到Account,这反过来又会发送一个GET请求 POST 逻辑失败,返回相同的视图以便显示错误

您的 POST 方法如下所示:

try 
    //your logic here

    //Everything worked, return a redirect
    return RedirectToAction("Account", accountViewModel);

catch (Exception ex)

    logger.Error(ex);
    ModelState.AddModelError("Register",ex.Message);


//If we get here, something went wrong. Return the view so errors are displayed
return View("Account", accountViewModel);

希望对你有帮助!

【讨论】:

这应该是正确的。将模型返回到视图而不是重定向应该可以工作 太棒了。非常感谢这个答案,解决了我的问题。我会尽可能奖励赏金(19 小时!)【参考方案2】:

其实你想要的是:

@Html.ValidationSummary(false)

您希望在表单上显示所有错误:reference。由于您没有将模型错误附加到特定属性,因此错误不会显示在任何表单元素验证中。

【讨论】:

不幸的是,这并没有改变视图中的任何内容 :-( 感谢您的尝试 这太奇怪了。如果您在页面上查看源代码并查看表单下方,那么是否显示任何错误? 你现在可以看到 HTML 输出了 :-)

以上是关于尽管向 ModelState 添加了消息,但 Html.ValidationMessage 为空的主要内容,如果未能解决你的问题,请参考以下文章

EmailAddress DataAnnotation 在 View 上标记为有效但 ModelState.IsValid = false?

创建一个类型化的 ModelState.AddModelError()

尽管包含更多条目,但数组仅在 for-loop 之后向 Struct 添加单个条目 - Swift/Xcode

向Steam致敬?玩家爆料Epic或将添加成就系统

Asp.Net Core Razor 页面中的“ModelState.AddModelError”显示不正确的错误消息

工作总结 ModelState.AddModelError("ShiYiObject", "对象不能为空!"); 小知识