通过 CSS 用框包围 ValidationSummary

Posted

技术标签:

【中文标题】通过 CSS 用框包围 ValidationSummary【英文标题】:Surrounding a ValidationSummary with a box via CSS 【发布时间】:2010-10-30 17:35:16 【问题描述】:

默认情况下,html.ValidationSummary() 会生成如下 HTML:

<span class="validation-summary-errors">There were some errors...</span>
<ul class="validation-summary-errors">
   <li>First Name too long</li>
   <li>Invalid Email Address</li>
</ul>

我想选择整个验证摘要并通过 CSS 在其周围添加一个边界框,所以我添加了一个这样的 CSS 类:

.validation-summary-errors
background-color:#D9FFB2;
border: 1px solid #5CBA30;
color:#000000;
margin-top:15px;
margin-bottom:15px;

现在的问题是,这会在验证摘要消息和每个错误消息周围绘制单独的框。当然不是我想的那样。

我可以像这样在摘要周围添加一个div,但是如果没有验证错误,这将导致一个空的红色框,所以不是这样:

  <div class="my-validation-summary">
        <h2>
            <%=Model.Message%>
        </h2>
        <%= Html.ValidationSummary("There were some errors...")%>
    </div>

我可以想出几种方法来解决这个问题:

使用服务器端标签有条件地添加边界 div 通过 jQuery 添加边界 div 编写我自己的 HtmlHelper 包装器,打印 CSS 友好的 ValidationSummary

但是,对于解决如此简单的任务,所有这些看起来都非常尴尬。必须有更好的方法来做到这一点。也许其他一些编写 CSS 类的方式,这样当没有验证摘要时我就不会得到一个空框?

编辑:为了澄清,我这样调用 html 助手:

<%=Html.ValidationSummary("There were some errors...") %>

编辑 2: 这个问题的范围是看看我是否忽略了一些非常容易和明显的东西。看来我没有,所以我将简单地添加适合我需要的自己的 HtmlHelper 函数。我投票结束我自己的问题。

【问题讨论】:

您是否自定义了验证摘要控件?默认情况下,它的呈现方式与您发布的方式不同。 不,我只是在使用重载 ValidationSummary 方法(参见上面的第一个编辑)– Adrian Grigore 13 秒前 我喜欢 MVC 源代码的可用性 - 打开它并编写自己的。祝你好运 【参考方案1】:

下面是一些可以使用的 CSS:

.validation-summary-errors 
    background-color: #D9FFB2;
    border:1px solid #5CBA30;
    width: 400px;
    
span.validation-summary-errors 
    border-bottom-color: #D9FFB2;
    display:block;
    
ul.validation-summary-errors 
    margin:0;
    padding:0;
    border-top:none;
    

您可能需要根据您的其他 css 来调整宽度。

评论后编辑

我将 ul.validation-summary-errors 更改为将边距和填充清零并删除宽度。它现在应该可以跨浏览器工作了。

【讨论】:

几乎:-)!这在 Firefox 3 中运行良好,但在 IE 7 中中断。请参阅 content.screencast.com/users/sandra123/folders/Jing/media/… 我的新版本代码有效吗?它应该修复在 IE7 中被推送的列表。【参考方案2】:

如果您有一个像您提供的第二个代码示例一样的包装 div。然后很容易使用 jQuery 将错误类从 span & ul 中“移动”到那个外部 div。

<html>
<head>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
  <script type="text/javascript">
    $(function() 
      var className = "validation-summary-errors";
      $("." + className).removeClass(className).closest("div").addClass(className);
    );
  </script>
  <style type="text/css">
    .validation-summary-errors  border: solid 1px red; ,
  </style>
</head>

<body>
  <div>
    <h2>My Modal Message</h2>
    <span class="validation-summary-errors">There were some errors...</span>
    <ul class="validation-summary-errors">
      <li>First Name too long</li>
      <li>Invalid Email Address</li>
    </ul>
  </div>
</body>
</html>

此代码将处理 HTML 使其看起来像这样......

  <div class="validation-summary-errors">
    <h2>My Modal Message</h2>
    <span class="">There were some errors...</span>
    <ul class="">
      <li>First Name too long</li>
      <li>Invalid Email Address</li>
    </ul>
  </div>

【讨论】:

正如我所说,我知道用 jQuery 解决这个问题很容易。但这似乎是一个非常尴尬的解决方案。【参考方案3】:

如果我没看错,而您只想要 span.validation-summary-errors 上的边框(而不是内部内容),那么:

.validation-summary-errors     border: 0 none transparent; /* set defaults for inner */
                               

span.validation-summary-errors background-color:#D9FFB2;   /* sets the span */
                               border: 1px solid #5CBA30;
                               color:#000000;
                               margin-top:15px;
                               margin-bottom:15px;
                               

应该这样做。

或者,可靠性稍差:

.validation-summary-errors     background-color:#D9FFB2;
                               border: 1px solid #5CBA30;
                               color:#000000;
                               margin-top:15px;
                               margin-bottom:15px;
                               

.validation-summary-errors > .validation-summary-errors,
.validation-summary-errors .validation-summary-errors
                               border: 0 none transparent; /* should apply styles to */
                                                           /* the children/descendants */
                                                            /* with the same name - untested though... */

【讨论】:

不,我想要一个包围验证摘要和消息的边框。【参考方案4】:

另一个需要的解决方案。

@Html.ValidationSummary(false, "", new  @class = "***YOUR CSS CLASS***" )

【讨论】:

以上是关于通过 CSS 用框包围 ValidationSummary的主要内容,如果未能解决你的问题,请参考以下文章

CSS:为啥 chrome 中的字母在像素缩放中被不同的颜色包围?

当 UpdatePanel 在计时器上更新自身时,css 样式会丢失

WebGL简易教程:包围球与投影

CSS布局 + Flex布局

5.24心得

CSS布局相关——盒模型和浮动