Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery JsonFilter单元测试是可行的,但实际场景并没有';t-内容类型出现错误-什么';发生什么事了?_Jquery_Asp.net Mvc_Mime Types - Fatal编程技术网

Jquery JsonFilter单元测试是可行的,但实际场景并没有';t-内容类型出现错误-什么';发生什么事了?

Jquery JsonFilter单元测试是可行的,但实际场景并没有';t-内容类型出现错误-什么';发生什么事了?,jquery,asp.net-mvc,mime-types,Jquery,Asp.net Mvc,Mime Types,我使用了一些JsonFilter ActionResultAttribute,它使用newtonsoft.Json Json转换器将请求中的Json转换为真实对象。这在一些基本参数上似乎可以正常工作,但在更复杂的情况下不起作用,所以我为它写了一个UT(是的,我应该TDD,但原型总是排在第一位…) 属性类方法: public override void OnActionExecuting(ActionExecutingContext filterContext) { if (fil

我使用了一些JsonFilter ActionResultAttribute,它使用newtonsoft.Json Json转换器将请求中的Json转换为真实对象。这在一些基本参数上似乎可以正常工作,但在更复杂的情况下不起作用,所以我为它写了一个UT(是的,我应该TDD,但原型总是排在第一位…)

属性类方法:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
        if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
        {
            string inputContent;
            using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
            {
                inputContent = sr.ReadToEnd();
            }
            var result = JavaScriptConvert.DeserializeObject(inputContent, JsonDataType);
            filterContext.ActionParameters[Param] = result;
        }
}
现在进行单元测试(使用Rhino):

现在-当从站点本身运行时,我进入了这段代码,ContentType总是显示为“application/x-www-form-urlencoded”。。即使是这样,ActionResult代码中看到的对象(LookupParameters)本身仍然填充了正确的字段!那么,在我的过滤器到达它之前,有什么东西在过滤它吗??在我看来是这样的,因为对象已正确地从json转换为真实对象,而且我的代码似乎从未被调用。这很好,但是其中一个属性(AdditionalParameters)是一个字典,并且总是空的。为了完整起见,这里是ActionResult代码:

[JsonFilter(Param = "lookupParams", JsonDataType = typeof(LookupParameters))]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Find(LookupParameters lookupParams)
{
    Dictionary<String, Object> addPrms = lookupParams.AdditionalParameters;
    ....

您将断点放在筛选器中的何处?您应该将其放在第一行:

if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
然后必须装饰控制器操作:

[ObjectFilter(Param="data", JsonDataType=typeof(JsonBag))] 

您的过滤器应该正在运行,但是如果contentType设置为“application/json”以外的任何值,那么过滤器中的代码将不会运行。它是在运行应用程序时在断点处停止的,而不是在模拟/测试时停止的吗?

好的-所以我是个d**k,但现在发现也许json序列化不是我想要的。让我快速展示一下这些改动:

jQuery—我们必须使用ajax来设置ContentType,而不是使用get/post(我假设$.post方法上的json数据类型对其进行排序,但这是返回值!-DOH):

现在在服务器端,显然只要将我的操作设置为AcceptPost,我们就离开了。它显示的是post/get将尝试将请求中的数据转换为对象类型,而不使用任何过滤器(甚至有用!),但是如果要在数据中发布json,则需要发送json字符串(实际上非常有意义)


有更好的jquery方法吗?

添加HttpContext.Request.InputStream.Position=0;在你使用声明之前。。。我花了大约30分钟才弄清楚为什么请求看起来是空的。

感谢您的快速响应,问题是我的筛选器OnActionExecuting override确实检查了contenttype“application/json”。问题似乎是在上下文中的请求被其他内容翻译后,过滤器被命中。如果我完全删除属性,只获取/发布一些json数据,数据就会自动转换为对象类型。这是做什么的?抱歉-回答你的最后一个问题:是的,当我在测试中中断时,内容类型是“application/json”(因为我在模拟中强制它),当我使用应用中断时,类型是“application/x-www-form-urlencoded”。唯一的方法是在我的过滤器收到请求之前,如果有什么东西已经翻译了请求。
    var json =
    {
        FormID: formId,
        IDFieldID: idField,
        NameFieldID: nameField,
        ReturnType: "html",
        SearchText: searchText,
        AdditionalParameters: adPrm // this is also a json format object
    };
    $.get(urlToAction,
        json,
        SomeFunctionIRun,
        "json");
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
[ObjectFilter(Param="data", JsonDataType=typeof(JsonBag))] 
   $.ajax({
        url: url,
        type: "POST", // MUST BE POST
        dataType: 'json',
        data: JSON.stringify(json), // HUH?? if i dont stringify it, it's just a form format
        contentType: "application/json; charset=utf-8", // HAS TO BE application/json
        success: LoadEntityLookupDialog
    });