如何在运行时将CSS应用于Html.ValidationSummary

时间:2013-03-20 10:25:59

标签: asp.net-mvc-4

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

感谢。

3 个答案:

答案 0 :(得分:1)

我建议使用TempData而不是更改validationsummary和@von描述得很好。使用bootstrap。你可以这样做:

<强>控制器

[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>
}

答案 1 :(得分: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。要了解更多关于两者的区别,您可以visit this SO page

<强>更新

[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" : "" })

答案 2 :(得分:0)

冯,我也非常感谢你的回答,但我同意MaxPayne的说法,你没有完全回答这个问题,更多的是关于IMO的工作。 我也正在研究如何设置ValidationSummary的样式,而无需使用ViewBag的额外包袱。

我同意你不应该在帖子之后返回相同的视图,除非有错误,但我确实有时候人们可能想要动态更改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