1

在我看来,如果字段中有错误,我需要设置一个字段以突出显示红色。我从控制器传递了一个错误字段列表,如果有匹配项,则有条件地将类设置为 errorField:

<td>@(cssClass = errorFields.Contains("Field1") ? "errorField" : "") <input type="text" id="field1" name="field1" value="@form.Field1" class="@cssClass" style="width: 5em;" /></td>

这适用于设置类值,但问题是我也将其渲染为:

<td>errorField <input...>

显然,我不希望 errorField 在那里呈现。如何防止这种行为?我可以将它包装在一个隐藏的 div 中,但我觉得这只是修复它的一种 hacky 方式(当然,我处理条件 CSS 的方式可能首先是 hacky)。

编辑:

根据大卫的回答,这就是我处理它的方式:

在模型中,我添加了 List ErrorFields 属性。还添加了与 David 给出的基本相同的方法,除了由于它处理不同的字段,它是:

public string ErrorCode(string field)
{
   return ErrorFields.Contains(field) ? "errorField" : "");
}

控制器没有将错误字段传递给 ViewBag,而是将其传递给模型中的 ErrorFields。

在视图中,基本上就像大卫给出的那样:

class="@form.ErrorCode("Field1")"

它运行正常。

4

1 回答 1

1

不要在视图中执行此操作,而是在模型上执行此操作。

在您的情况下,您可以只ErrorClass在模型上拥有一个属性(或类似名称的东西)。像这样的东西:

public string ErrorClass
{
    get
    {
        return errorFields.Contains("Field1") ? "errorField" : string.Empty;
    }
}

然后在视图中绑定到属性:

class="@Model.ErrorClass"

在不了解您的模型的情况下,不可能比这更具体。在这种情况下可能有多个类,这可能需要某种集合,或者可能将错误指示器放在父模型中有集合的子模型上。也有可能(在这种情况下甚至可能)有更简单的内置验证功能可以实现您正在寻找的东西。

关键是,一般来说,任何时候你试图在你的视图中做这样的构造:

var something = "a value";

那么很有可能您错误地使用了视图,而应该将其放入模型中。

于 2013-06-12T17:10:58.380 回答