3

我正在构建我的第一个 MVC4 网站,我想在页面成功提交时显示成功消息。我已经通过使用实现了, ModelState.AddModelError(("", "Data successfully saved.");但它显示为红色。我想根据某些条件在运行时应用不同的 css。

谢谢。

4

3 回答 3

1

我建议使用 TempData 而不是更改验证摘要,@von 很好地描述了它。使用引导程序。你可以这样做:

控制器

[HttpPost]
    public ActionResult ManageUsers(UserViewModel model)
    {
        if (ModelState.IsValid)
        {
            User obj = new User();
            obj.UserName = model.Email;
            obj.FirstName = model.FirstName;
            obj.LastName = model.LastName;
            obj.Email = model.Email;
            obj.Phone = model.Phone;
            obj.Notes = model.Notes;
            obj.Authorized = model.Authorized;
            UserRepository.SaveUser(obj);
            TempData["Success"] = "Yes";
        }
        return View(model);
    }

看法

@Html.ValidationSummary()
@if (TempData["Success"] != null)
{
                <div class="alert alert-success">
                    <a href="#" class="close" data-dismiss="alert">&times;</a>
                    <strong>Success!</strong> The User account was created.
                </div>
}
于 2014-12-16T18:18:28.907 回答
0

通常,当操作方法的结果成功时,会发生重定向,也许这就是您想要的,特别是如果您的结果不是 json 结果。但是,如果您在发布后返回相同的视图,那么您做错了。如果在ModelState帖子上有效,即如果验证通过(例如提供了必填字段),并且您通过添加错误消息,ModelState.AddModelError(("", "Data successfully saved.")那么您将ModelState进入无效状态。这就是为什么你有红色的原因。

现在假设你真的想返回相同的视图,那么我想你有类似的东西:

    [HttpPost]
    public ActionResult YourActionMethod(YourModel model)
    {          
        // some code goes here

        ModelState.AddModelError(("", "Data successfully saved.")
        return View(", model);
    }

你应该拥有的是这样的:

        [HttpPost]        
        public ActionResult YourActionMethod(YourModel model)
        {          
            // some code goes here

            ViewBag.SuccessMessage = "Data successfully saved.";
            return View(", model);
        }

然后在你看来是这样的:

@Html.ValidationSummary(true)
if (!string.IsNullOrWhiteSpace(ViewBag.SuccessMessage)) {
            <div class="success-summary">
                <p>@ViewBag.SuccessMessage</p>
            </div>    
}

请注意,您不需要@在 if 之前添加额外内容,该代码假定它在form标签内,使用@using. 然后对于CSS:

.success-summary {
    color: #3366FF;
}

您实际上可以使用 ViewData 或 ViewBag。要了解更多关于两者的区别,您可以访问这个 SO 页面

更新:

[HttpPost]        
            public ActionResult YourActionMethod(YourModel model)
            {          
                //
                If (ModelState.IsValid) {
                                @ViewBag.IsModelValid = true;
                                ModelState.AddModelError("", "Data successfully saved."); 
                                return View(model);  
                }

                ViewBag.SuccessMessage = "Data successfully saved.";
                return View(", model);
            }

您的看法:

@Html.ValidationSummary(false, "", new { @class= (ViewBag.IsModelValid!=null && ViewBag.IsModelValid) ? "success-summary" : "" })
于 2013-03-20T12:05:04.550 回答
0

冯,我也很欣赏你的回答,但我同意 MaxPayne 的观点,即你没有完全提供这个问题的答案,更多的是围绕 IMO 的工作。我也在寻找一种无需使用 ViewBag 的额外包袱来设计 ValidationSummary 的方法。

我同意您不应该在发布后返回相同的视图,除非出现错误,但我确实相信有时人们可能想要动态更改 ValidationSummary 样式而不必使用 ViewBag。

到目前为止,这是我唯一的领导http://westcountrydeveloper.wordpress.com/2011/07/06/mvc-validation-part-4-styling-the-validation-controls/

我想您可以使用一些 JQuery 根据验证响应更改元素的 css 属性。

var valid = $("#formID").validate().element("#ElementID");
//or
var valid = $('#formID').validate();
// Then use $(".ElementClass").css({}); to change the the style
于 2014-02-18T01:00:36.310 回答