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

Razor 使用AdditionalFields与其他类中的字段进行比较,razor,asp.net-core-mvc,remote-validation,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中,我在其中一个属性上添加了一个自定义验证属性,该属性继承自RemoteAttribut

导言

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

public class BaseViewModel
{
    public FirstViewModel First { get; set; }    
    public SecondViewModel Second { get; set; }
}
FirstViewModel
中,我在其中一个属性上添加了一个自定义验证属性,该属性继承自
RemoteAttribute
。我的目标是使用此属性将值与
SecondViewModel
中的属性进行比较。我已经使用
RemoteAttribute
AdditionalFields
属性设置了这个属性

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

data-val-remote-additionalfields="*.PropOfModelFirst,*.PropOfModelSecond"
当客户端验证调用控制器操作时,*。被框架替换为第一个。,这是错误的,因为第二个值不是第一个-类的一部分

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

data-val-remote-additionalfields="*.PropOfModelFirst,*.Second.PropOfModelSecond"
但正如可以预料的那样,它被更改为First.Second.PropOfModelSecond

问题


AdditionalFields属性可用于与另一个ViewModel的值进行比较吗?

您不能使用
AdditionalFields
与另一个ViewModel的值进行比较。原因是规则是通过
jquery.validate.unobtrusive.js
插件添加到
jquery.validate.js
(该插件读取
数据val-*
HtmlHelper
方法生成的属性)。特别是
适配器。将(“remote”、[“url”、“type”、“additionalfields”]、函数(options){
方法预先挂起
到属性名称中

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

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

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

控制器方法将在哪里

[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)
    }
}

简短的回答是否定的。但是您使用的是视图模型,那么为什么不使用一个包含所有属性的单一“平面”视图模型呢?我的视图模型有很多属性,它们将字段划分为不同的功能类别,但是将其更改为单一模型是值得考虑的。是否还有一个较长的“是”答案?:)使用
[Remote]
属性,然后仅当您要修改
jquery.validate.unobtrusive,js
(那太疯狂了)。但是
[Remote]
属性无论如何都不是很有效-一旦它最初被验证,然后它就会在每个
.keyup()上被验证(也就是说,可能会进行大量ajax调用。您可以随时编写自己的
ajax()
代码来调用您的方法(如果无效,请更新由
@Html.ValidationMessageFor()
生成的元素)谢谢你的评论。请随意把它们写在回答中,如果没有有效的选择建议,我会接受。当然可以,但我马上就要吃了,所以需要一个小时左右。
[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)
    }
}