【问题标题】:Custom Editor template based on ViewModel Dataannotation attribute MVC4基于 ViewModel Dataannotation 属性 MVC4 的自定义编辑器模板
【发布时间】:2023-04-07 21:47:01
【问题描述】:

如果 [Required] 属性修饰了我的 ViewModel 属性,无论是整数、双精度、字符串、日期等,我想要做的是在我的输入文本框之后自动添加一个图像跨度

例如,我的 ViewModel 可能看起来像

public class MyViewModel 
{
    [Required]
    public string  Name { get; set; }
}

我的视图看起来像

@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)

输出会是这样的

<input id="Name" class="text-box single-line" type="text" value="" name="Name" data-val-required="The Name field is required." data-val-length-max="20" data-val-length="The field Name must be a string with a maximum length of 20." data-val="true">
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Name"></span>

-- Note the automatically added span
<span class="indicator required" style="width: 11px;"></span>

我打算有一些可以显示图像的 css,即

span.required {
    background-image: url("required.png");
}

这是否可行,或者我是否需要创建自己的 Helper 方法来实现此类功能?

【问题讨论】:

    标签: view asp.net-mvc-4 viewmodel data-annotations editorfor


    【解决方案1】:

    是的,这是可能的,但总的来说我不会推荐它,因为模板确实可以自定义类型呈现,并且您应该能够创建模板而不必担心它是否会覆盖另一个模板。

    我会改为创建一个自定义的 LabelFor 帮助器,例如这里描述的那个:

    http://weblogs.asp.net/imranbaloch/archive/2010/07/03/asp-net-mvc-labelfor-helper-with-htmlattributes.aspx

    或这里:

    http://weblogs.asp.net/raduenuca/archive/2011/02/17/asp-net-mvc-display-visual-hints-for-the-required-fields-in-your-model.aspx

    第三种选择是不在 MVC 中做任何事情,而是添加一些 javascript,这些 javascript 将基于标准 MVC 验证数据属性添加指标(如果您使用不显眼的验证)。在这里查看答案:

    https://stackoverflow.com/a/8524547/61164

    【讨论】:

      【解决方案2】:

      如果出现验证错误,我所做的是修改 jquery.validate.unobtrusive JS 文件以添加第二个容器,专门用于您的图像。

      var container2 = $(this).find("[data-valimg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
              replace = $.parseJSON(container.attr("data-valimg-replace")) !== false;
      
          container2.removeClass("img-validation-valid").addClass("img-validation-error");
      

      然后别忘了绑定到模型上:

      error.data("unobtrusiveContainer", container2);
      

      最后,在 if (replace) 代码块中清空:

      if (replace) {
              container.empty();
              container2.empty();
              error.removeClass("input-validation-error").appendTo(container);            
          }
          else {
              error.hide();
          }
      

      成功后记得隐藏:

      var container2 = error.data("unobtrusiveContainer"),
              replace = $.parseJSON(container.attr("data-valimg-replace"));
      
          if (container2) {
              container2.addClass("img-validation-valid").removeClass("img-validation-error");
              error.removeData("unobtrusiveContainer");
      
              if (replace) {
                  container2.empty();
              }
          }
      

      如果您查看文件中的 onError 和 onSuccess 函数,您应该能够找到可以将它们放入的位置。

      在您看来,将以下代码行添加到每个要验证的表单输入中:

      <img class="img-validation-valid" data-valimg-replace="true" data-valimg-for="<replace with field name here, ie. Name>" src="required.png" />
      

      我只用[Required] 属性对此进行了测试,但它确实有效。我也很确定您也可以使用它来生成其他内容,而不仅仅是图像。

      【讨论】:

      • 干杯朱利安,我会试一试,让你知道我想出了什么
      • 我不会修改 jquery.unobtrusive.js,因为此文件会不时更新,您必须不断重新应用更改。更好的解决方案是只使用带有现有属性的 jquery。
      • 是的,如果有办法通过外部脚本文件添加这些更改,比如简单地扩展这两个函数,那就更好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2018-10-08
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多