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

时间:2018-07-26 07:42:45

标签: razor asp.net-core-mvc remote-validation

简介

在MVC Core中,我有一个基本ViewModel和作为属性包含在基本模型中的两个ViewModel,如下所示:

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

FirstViewModel中,我从RemoteAttribute继承了一个自定义验证属性。我的目标是使用此属性将值与SecondViewModel中的属性进行比较。我已经使用AdditionalFields的{​​{1}}属性进行了设置。

我认为我的问题在于将HTML属性添加到剃刀视图中的控件的方式:

RemoteAttribute

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

我尝试将类名添加到第二个属性之前,结果是

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

但可以预见,它将更改为First.Second.PropOfModelSecond。

问题

是否可以使用AdditionalFields属性与另一个ViewModel的值进行比较?

1 个答案:

答案 0 :(得分:1)

您不能使用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.ABCSecond.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)
    }
}