我可以让mvc模型验证为不同的编辑器使用不同的错误css样式吗?

时间:2012-08-30 06:58:29

标签: c# css asp.net-mvc-3 validation razor

当我们使用mvc模型验证引擎时,它会自动将Site.css中的某些css类添加到由HTML帮助程序方法生成的编辑器中;即某些对象中的一个:

.field-validation-error
{
    color: #ff0000;
}

.field-validation-valid
{
    display: none;
}

.input-validation-error
{
    border: 1px solid #ff0000;
    background-color: #ffeeee;
}

.validation-summary-errors
{
    font-weight: bold;
    color: #ff0000;
}

.validation-summary-valid
{
    display: none;
}

我们可以编辑这些样式以应用所需的样式。

但是有没有机会告诉模型验证引擎,根据用户的要求使用什么样的确切样式,以便我们可以有一个不同字段的页面,样式不同?

修改

假设我们有以下观点:

@model ModelValidation.Models.Appointment
@{
    ViewBag.Title = "Make a Booking";
}
<h2>
    Book an Appointment</h2>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <p>
        @Html.LabelFor(m => m.ClientName, "Your name: ") @Html.EditorFor(m => m.ClientName)
        @Html.ValidationMessageFor(m => m.ClientName)
    </p>        
    <p>
        @Html.LabelFor(m => m.Date, "Appointment Date: ") @Html.EditorFor(m => m.Date)
        @Html.ValidationMessageFor(m => m.Date)
    </p>
    <p>
        @Html.EditorFor(m => m.TermsAccepted) @Html.LabelFor(m => m.TermsAccepted, "I accept the terms & conditions")
        @Html.ValidationMessageFor(m => m.TermsAccepted, null, new { @class = "other-input-validation-error" })
    </p>
    <input type="submit" value="Make Booking" />
}

如果@Html.ValidationMessageFor重载,我们可以指定css类来设置错误消息的样式。但是我们如何为编辑器指定css类?

2 个答案:

答案 0 :(得分:1)

我确实在急躁地等待其他答案,但直到这就是我想出来的。

对于Html.TextBoxForHtml.PasswordFor等具体帮助方法,存在必要的重载。以下示例显示了我想要的内容:

@using (Html.BeginForm())
{
    <p>
        @{ModelState state = ViewData.ModelState["ClientName"];            
        }
        @Html.LabelFor(m => m.ClientName, "Your name: ")
        @if (state != null && state.Errors.Count > 0)
        {
            @Html.TextBoxFor(m => m.ClientName, new { @class = "other-input-validation-error" })
        }
        else
        {
            @Html.EditorFor(m => m.ClientName)
        }
        @Html.ValidationMessageFor(m => m.ClientName)
    </p>        
}

但我仍然愿意接受任何其他想法如何做到这一点。我对asp很新,可能很容易丢失(根本就不知道)这项技术的一些不错的功能。

修改

正如 Sanderson S. Freeman A. - Pro ASP.NET MVC 3 Framework第三版

中所述
  

我们不能使用模板化助手为a生成编辑器   属性,如果我们也想提供额外的属性,所以我们有   使用了Html.TextBoxFor帮助程序,并使用了该版本   接受用于HTML属性的匿名类型。

答案 1 :(得分:0)

您始终可以使用该特定页面中包含的另一个css文件来覆盖您的设置。 要覆盖MVC生成的CSS的设置,您可以使用像这样的容器ID

#container .mvc_css_class
{
    display: none;

}

另一种选择是使用元素名称来增加自己的css的优先级,但是通过指定不同的ID不起作用

div.mvc_css_class
{
    display: none;

}

因此,如果您想以不同方式设置单个页面的样式,只需包含您的css文件并将容器ID设置为该页面的其他值,新的css设置将根据容器覆盖。

编辑: 要选择在每个页面上覆盖样式,必须在每个页面上使用单独的设置。首先以不同方式命名表单容器ID

<div id="container-homepage">
    ...... the form data with original settings ..
</div>
在您的css文件中

,使用id为主页

应用所需的样式
#container-homepage .mv_generated_class{ 
    color : blue;
}

对你想要看起来不同的所有页面和类重复相同的