首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用AdditionalFields与不同类中的字段进行比较

使用AdditionalFields与不同类中的字段进行比较
EN

Stack Overflow用户
提问于 2018-07-26 07:42:45
回答 1查看 245关注 0票数 0

Introduction

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

代码语言:javascript
代码运行次数:0
运行
复制
public class BaseViewModel
{
    public FirstViewModel First { get; set; }    
    public SecondViewModel Second { get; set; }
}

FirstViewModel中,我在其中一个属性上添加了一个自定义验证属性,继承自RemoteAttribute。我的目标是使用这个属性将值与SecondViewModel中的属性进行比较。我已经使用AdditionalFields属性设置了RemoteAttribute

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

代码语言:javascript
代码运行次数:0
运行
复制
data-val-remote-additionalfields="*.PropOfModelFirst,*.PropOfModelSecond"

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

我尝试在第二个属性前加上类名,结果导致

代码语言:javascript
代码运行次数:0
运行
复制
data-val-remote-additionalfields="*.PropOfModelFirst,*.Second.PropOfModelSecond"

但正如可以预期的那样,这将更改为First.Second.PropOfModelSecond。

问题

可以使用AdditionalFields属性与来自另一个ViewModel的值进行比较吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 09:56:22

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

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

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

删除[Remote]属性,并添加以下脚本(假设属性为First.ABCSecond.XYZ)

代码语言:javascript
代码运行次数:0
运行
复制
$('#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');
        }
    })
});

其中控制器方法将是

代码语言:javascript
代码运行次数:0
运行
复制
[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)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51533508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档