如何在mvc3中为嵌套控件添加“input-validation-error”

时间:2012-05-08 09:28:04

标签: asp.net-mvc-3 modelstate editorfor

我有一个这样的对象:

public class Test
{
    public String TestValue { get; set; }
}

对于此对象,有一个模板的自定义编辑器:

@inherits System.Web.Mvc.WebViewPage<MvcApplication12.Models.TestModel>
@Html.EditorFor(m => m.TestValue)

和Model-Binder:

public class TestBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult providerValue =
            bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".TestValue");
        bindingContext.ModelState.SetModelValue(bindingContext.ModelName + ".TestValue", providerValue);            

        if (null != providerValue && !String.IsNullOrWhiteSpace(providerValue.AttemptedValue))
        {
            Test test = new Test();
            test.TestValue = providerValue.AttemptedValue;
            return test;
        }

        return null;
    }
}

控制器的模型是这样的:

public class LogOnModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Required]
    [Display(Name = "Value")]
    public Test Value { get; set; }
}

你可以看到,我使用Test对象,它将由上面显示的模板的自定义编辑器呈现。

剃刀语法是这样的:

            <div class="editor-label">
            @Html.LabelFor(m => m.Password)
        </div>
        <div class="editor-field">
            @Html.PasswordFor(m => m.Password)
            @Html.ValidationMessageFor(m => m.Password)
        </div>

        <div class="editor-label">
            @Html.LabelFor(m => m.Value)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Value)
            @Html.ValidationMessageFor(m => m.Value)
        </div>

模型中的数据转换表明,测试对象的输入(m.Value)是必需的。当此字段没有输入时,ModelBinder(TestBinder)将返回null。

然后验证消息显示如下:

Web Page

但是名为“input-validation-error”的css类没有添加到输入字段中。

如何实现,在模型错误mvc3上将css类“input-validation-error”添加到自定义编辑器模板的所有嵌套输入字段中?

1 个答案:

答案 0 :(得分:1)

最后我解决了它。 有两种方法可以做到。

  1. 如果自定义编辑器中只有一个字段,则可以使用设置名称的文本框
  2. @inherits System.Web.Mvc.WebViewPage<MvcApplication12.Models.TestModel> @Html.TextBox("", Model.TestValue)

    1. 但也许你的自定义编辑器中有多个字段。
    2. 首先,您必须更改您的css文件并添加一行,如下所示

      .inner-input-validation-error input[type=text]

      现在,您可以说出错误字段的外观。也许是这样的

      .inner-input-validation-error input[type=text],
      input.input-validation-error,
      textarea.input-validation-error,
      select.input-validation-error
      {
          border: 1px solid black;
          background-color: red;
          font-size:100%;
      }
      

      现在更改模板的自定义编辑器,以便在包含编辑字段的范围内添加错误类.inner-input-validation-error

          @inherits System.Web.Mvc.WebViewPage<MvcApplication12.Models.TestModel>
          <span
              @if (!ViewData.ModelState.IsValid)
              {
                  <text>
                      class="inner-input-validation-error"
                  </text>
              }
          >
          @Html.EditorFor(model => model.TestValue1)
          @Html.EditorFor(model => model.TestValue2)
      
      </span>
      

      多数民众赞成。