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

使用AdditionalFields与其他类中的字段进行比较

  •  0
  • MeanGreen  · 技术社区  · 6 年前

    介绍

    在MVC核心中,我有一个基本视图模型和两个视图模型作为属性包含在基本模型中,如下所示:

    public class BaseViewModel
    {
        public FirstViewModel First { get; set; }    
        public SecondViewModel Second { get; set; }
    }
    

    FirstViewModel 我在其中一个属性上添加了自定义验证属性,该属性继承自 RemoteAttribute . 我的目标是使用此属性将值与中的属性进行比较 SecondViewModel . 我用 AdditionalFields 性质 远程属性 .

    我认为我的问题在于如何在Razor视图中将HTML属性添加到控件中:

    data-val-remote-additionalfields="*.PropOfModelFirst,*.PropOfModelSecond"
    

    当客户端验证调用控制器操作时, * 被框架替换为 第一。 ,这是错误的,因为第二个值不是 弗斯特 一流的。

    我试图在第二个属性前面加上类名,结果

    data-val-remote-additionalfields="*.PropOfModelFirst,*.Second.PropOfModelSecond"
    

    但正如所料,这改为first.second.propofmodelsecond。

    问题

    AdditionalFields属性是否可用于与其他ViewModel的值进行比较?

    1 回复  |  直到 6 年前
        1
  •  1
  •   user3559349    6 年前

    不能使用 AdditionalFields 与另一个ViewModel中的值进行比较。原因是规则被添加到 jquery.validate.js jquery.validate.unobtrusive.js 插件(它读取 data-val-* 属性由生成 HtmlHelper 方法)。具体来说是 adapters.add("remote", ["url", "type", "additionalfields"], function (options) { 预挂起的方法 First 属性名称。

    一种选择是使用包含所有属性的单一“平面”视图模型。

    如果不希望这样做,那么您可以编写自己的Ajax代码来调用执行验证的服务器方法。这实际上也有一些额外的性能优势。默认情况下,初始验证后由 .blur() 事件,对每个 .keyup() 事件,这意味着如果用户最初输入的值无效,您可能会进行大量的Ajax和数据库调用。

    移除 [Remote] 属性,并添加以下脚本(我假设属性为 First.ABC Second.XYZ )

    $('#First_ABC').change(function() {
        var url = '@Url.Action(...)'; // add your action name
        var input = $(this);
        var message = $('[data-valmsg-for="First.ABC"]'); // or give the element and id attribute
        $.post(url, { abc: input.val(), xyz: $('#Second_XYZ').val() }, function(response) {
            var isValid = response === true || response === "true";
            if (isValid) {
                input.addClass('valid').removeClass('input-validation-error');
                message.empty().addClass('field-validation-valid').removeClass('field-validation-error');
            } else {
                input.addClass('input-validation-error').removeClass('valid');
                message.text(response).addClass('field-validation-error').removeClass('field-validation-valid');
            }
        })
    });
    

    控制器方法的位置

    [HttpPost]
    public ActionResult Validate(string abc, string xyz)
    {
        bool isValid = .... // code to validate
        if (isValid)
        {
            return Json(true, JsonRequestBehaviour.AllowGet);
        }
        else
        {
            return Json("your error message", JsonRequestBehaviour.AllowGet)
        }
    }