【问题标题】:.svc webservice returns d json object.svc Web 服务返回一个 json 对象
【发布时间】:2014-09-14 18:00:58
【问题描述】:

我正在使用 Bootstrapvalidator.com 从 jquery 调用 .net svc 服务。我使用远程选项来检查用户名是否已被使用,请参见此处:http://bootstrapvalidator.com/validators/remote/

问题是我的 .svc 服务正在返回 bool 值,例如:{"d":true},而 bootstrapvalidator 期待 {"valid":true}。我在某处读到微软出于安全原因使用 d 但我再也找不到这篇文章了。

问题是,我能返回 {"valid":true} 还是我的结果总是 {"d":true}。如果是后一种情况,那么我想尝试使输出如下: {"d": [ "valid" : true ] } 并希望 bootstrapvalidator 会为有效执行 .find ,也许这会起作用。但我不确定如何创建这样的输出。

功能:

public bool CheckUsername(string userName) {
    try {
        using (var dbC = new DataContext(ConfigurationManager.ConnectionStrings[_environment].ToString())) {
            bool valid = false;
            var check = dbC.UserSelectByUsername(userName).ToList();
            if (check.Count() > 0) {
                return valid;
                }
            else {
                return valid = true;
                }
            }
        }
    catch (Exception exc) {
        Log.Error("Error in .", exc);
        return false;
    }           
}

【问题讨论】:

  • 必须可以返回您自己定义的 JSON。我不太了解网络服务,但也许这会有所帮助。stackoverflow.com/questions/288850/…
  • 嘿,读得很好,只能确认 d 不能被删除。它显然是在 3.5 中添加的,无法撤消。

标签: jquery web-services


【解决方案1】:

好的,因为您对其他答案不太满意,我们破解 BootStrapValidator 怎么样!

好吧,不要“破解”更多 extend http://bootstrapvalidator.com/examples/overriding-default-options/

在 github https://github.com/nghuuphuoc/bootstrapvalidator/blob/master/src/js/validator/remote.js 第 59 行附近的某个地方,您会发现:

xhr.then(function(response) {
                dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
            });

这可以简单地被覆盖/扩展(你必须扩展/覆盖整个validate方法),只需将其更改为:

xhr.then(function(response) {
                dfd.resolve($field, 'remote', response.d.valid === true || response.d.valid === 'true', response.d.message ? response.d.message : null);
            });

我知道的小变化。 服务员,我的汤里有一个d http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/

所以我猜这会解决问题(在包含 BootstrapValidator javascript 后的某个时间调用):

$(document).ready(function () {
    $.fn.bootstrapValidator.validators.remote = $.extend({}, $.fn.bootstrapValidator.validators.remote, {
        validate: function (validator, $field, options) {
            var value = $field.val();
            if (value === '') {
                return true;
            }

            var name = $field.attr('data-bv-field'),
                data = options.data || {},
                url = options.url,
                type = options.type || 'POST';

            // Support dynamic data
            if ('function' === typeof data) {
                data = data.call(this, validator);
            }

            // Support dynamic url
            if ('function' === typeof url) {
                url = url.call(this, validator);
            }

            data[options.name || name] = value;

            var dfd = new $.Deferred();
            var xhr = $.ajax({
                type: type,
                url: url,
                dataType: 'json',
                data: data
            });
            xhr.then(function (response) {
                dfd.resolve($field, 'remote', response.d.valid === true || response.d.valid === 'true', response.d.message ? response.d.message : null);
            });

            dfd.fail(function () {
                xhr.abort();
            });

            return dfd;
        }
    });
});

【讨论】:

  • 这成功了。我不是它的粉丝,但现在它是最好的方式。所以谢谢!!
【解决方案2】:

我认为,如果您定义一个具有有效属性的类,并将其设置为 true,那么它将正确序列化。我认为您当前的问题是您直接返回布尔值,而 d 是因为它不能将 true 作为 JSON 对象返回。

public class X
{
   public bool valid { get; set;}
}

然后做:

public bool CheckUsername(string userName) {
    try {
        using (var dbC = new DataContext(ConfigurationManager.ConnectionStrings[_environment].ToString())) {
            bool valid = false;
            var check = dbC.UserSelectByUsername(userName).ToList();
            if (check.Count() > 0) {
                return new X { valid = valid };
                }
            else {
                return new X { valid = true };
                }
            }
        }
    catch (Exception exc) {
        Log.Error("Error in .", exc);
        return new X { valid = false };
    }           
}

【讨论】:

  • 这也是我的第一个想法,但我认为 d 的原因不同,我只是找不到找到 d 原因的文章或线程。很难 google d ;-) 我已经尝试了您的解决方案并得到以下结果: {"d":{"__type":"AjaxService.X:#Webservices.Services","valid":true} } 这似乎没有遗憾地与 bootstrapvalidtor 结合使用,所以我想这个问题没有解决方案。
  • "d" 用于返回原语和数组(因为直接返回数组可能会受到影响),但我认为它不会用于类。
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2016-06-29
  • 1970-01-01
相关资源
最近更新 更多