代码之家  ›  专栏  ›  技术社区  ›  Kevin

带有指定css类的html.textbox与表单验证css冲突(输入验证错误)

  •  0
  • Kevin  · 技术社区  · 15 年前

    有趣的情况。我有一个html.textbox(),从视图中呈现如下:

    <%= Html.TextBox("title", Model.Title, new { @class = "txt" }) %>
    

    在我的控制器中,我对标题进行了以下的验证(稍微简化了一些)。为了参数起见,假设它找到了错误,并使用ModelState错误信息重新呈现视图。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult EditBook(string title) {
        Model = new Book(ControllerContext.RequestContext);
        if (String.IsNullOrEmpty(title))
        {
            title = String.Empty;
            ModelState.AddModelError("title", "* Title is a required");
            modelState.SetModelValue("title", ValueProvider["title"]);
        }
        else { // show confirmation }
    
        if (!ModelState.IsValid)
        {
            return View("EditBook", Model);
        }
    }
    

    重新呈现页面时,我的HTML文本框会正确附加输入验证错误类…但这是没用的,因为它是头等舱的附属品!我需要它来覆盖我的文本框上的所有现有样式。HTML输出如下:

    <input type="text" name="title" id="title" class="input-validation-error txt"/>
    

    假设已经定义了以下CSS样式:

    input.txt { border: 1px; color: #000 }
    .input-validation-error { border: 2px solid #fff }
    

    问题是,我原来的CSS类“txt”优先,并阻止我能够正确设置错误文本框的样式。

    有什么想法吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   dso    15 年前

    这更像是一个CSS问题,而不是特定于ASP.NET MVC的问题。您应该查看 CSS spec .

    考虑到这一点,您可以通过如下方式调整样式的优先级:

    input.txt { border: 1px; color: #000 }
    input.input-validation-error { border: 2px solid #fff }
    

    随着输入元素添加到输入验证错误类中,这两种样式的特殊性将是相同的。这将导致使用样式的声明顺序来确定优先级(在这种情况下,规范会说最后一个声明的获胜)。

    注意上面的例子只是一种控制优先级的方法…也许有更好的方法,但我不是CSS专家。如果你用CSS标签作为一个CSS问题重新提问,你可能会得到更好/更深刻的回答。

    在确定优先级时,类名称在元素上的声明顺序是不相关的。

        2
  •  1
  •   Blair Scott    15 年前

    如果你加上!重要的修饰语它应该有助于解决这个问题。

    .input-validation-error { border: 2px solid #fff !important; }
    

    另外,修改一下@dso所说的内容,我相信您也可以尝试一下:

    input.txt { border: 1px; color: #000 }
    input.txt.input-validation-error { border: 2px solid #fff }
    

    就像我说的,如果你有两个CSS类,我很确定你能做到。

        3
  •  1
  •   Kevin    15 年前

    我没有依赖框架来呈现样式,而是使用了一种方法,在这种方法中,我可以应用自己的CSS类,同时仍然使用大部分html.validationmessage()基础结构。

    看起来像这样:

    <% bool emailError = !String.IsNullOrEmpty(Html.ValidationMessage("email"));  %>
    <div id="EmailMod" class="module <%= emailError ? "error" : String.Empty %>">
        <label class="text_right">Email address</label>
        <div class="input">
            <input type="text" id="Email" name="Email" class="input" tabindex="1" />
            <p id="EmailRequired" class="required <%= emailError ? "" : "hide" %>">* Please enter a valid email address.</p>
        </div>
    </div>