Jquery JsonFilter单元测试是可行的,但实际场景并没有';t-内容类型出现错误-什么';发生什么事了?
我使用了一些JsonFilter ActionResultAttribute,它使用newtonsoft.Json Json转换器将请求中的Json转换为真实对象。这在一些基本参数上似乎可以正常工作,但在更复杂的情况下不起作用,所以我为它写了一个UT(是的,我应该TDD,但原型总是排在第一位…) 属性类方法: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
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
});