Razor 使用AdditionalFields与其他类中的字段进行比较
导言 在MVC Core中,我有一个基本ViewModel和两个作为属性包含在基本模型中的ViewModel,如下所示: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
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)
}
}