我在ajax
ASP.NET
解决方案上对控制器进行MVC
调用,如下所示:
$.ajax({
url: "ControllerClass/ControllerMethod?date=" + date,
type: "POST",
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (result) {
globalVariable = result; // This is for later...
DoSomething(result);
},
async: true,
processData: false
})
控制器一旦完成了服务器端的所有工作,它就会返回一个包含不同属性类型的对象(一个Int,一个Int数组和一个对象列表)
我将数据从控制器返回到JS文件的方式是......
return Json(new
{
summary = objectResult
});
关键是,从JavaScript开始,现在我想用我在我的JavaScript中定义的globalVariable中存储的信息调用另一个Controller,如下所示:
var globalVariable
那个var位于我的JS文件的顶部......
好吧,我试图用这个变量回调我的控制器的方式如下:
$.ajax({
url: "ControllerClass/ControllerMethod?result=" + globalVariable,
type: "POST",
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (result) {
DoSomethingNewWithThisresult(result)
},
async: true,
processData: false
})
这是我在C#中的控制器。
public IActionResult ControllerMethod(JsonResult result)
{
DoSomethingHereWithTheResult(result);
}
为什么我在最后一个控制器上放置了一个breakpoing,结果变量为空?我在Chrome上查看该变量包含我要查找的所有数据。实际上,如果我只是传递了对象的一个属性,它就会很好地进入控制器,但是我无法通过整个对象......
答案 0 :(得分:1)
尝试创建自己的自定义模型,而不是在操作中使用 JsonResult 作为参数,并以这种方式在ajax调用中使用它:
$.ajax({
url: "ControllerClass/ControllerMethod",
type: "POST",
dataType: 'json',
data: { Summary: globalVariable.summary},
contentType: 'application/json; charset=utf-8',
success: function (result) {
DoSomethingNewWithThisresult(result)
}
})
public class YourClass
{
public string Summary { get; set;}//// string type or whatever it is
}
public IActionResult ControllerMethod(YourClass result)
{
DoSomethingHereWithTheResult(result);
}
或者您也可以使用JSON.stringify以这种方式序列化您的对象:
var customObject={
"Summary" : globalVariable.summary
};
$.ajax({
url: "ControllerClass/ControllerMethod",
type: "POST",
dataType: 'json',
data: JSON.stringify(customObject),
contentType: 'application/json; charset=utf-8',
success: function (result) {
DoSomethingNewWithThisresult(result)
}
})
答案 1 :(得分:0)
假设这是一个Web API控制器,有多种方法可以从URL中读取复杂类型 - (MVC控制器也有类似的选项)
如果参数在UrL中传递,并假设它们以1:1映射到您的对象,则可以使用[FromUri]属性修饰对象,例如:
public class GeoPoint
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public ValuesController : ApiController
{
public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}
另一个选项可以让您更灵活地控制对象的创建并填充参数,方法是使用IModelBinder接口和[ModelBinder]属性。
您可以使用唯一的方法“BindModel”实现IModelBinder接口,以便在调用Controller方法之前访问HTTP请求,创建对象,读取URL查询参数,在对象中设置值,然后最终分配它到bindingContext的Model属性:
一个简单的例子是这样的:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyComplexType))
{
MyComplexType model ;
//You can use the value provider or get it from the HttpRequest
//var theValue = bindingContext.ValueProvider.GetValue ( bindingContext.ModelName);
//var theValue = request.RequestUri.ParseQueryString ( ) ;
if ( new MyComplexTypeConverter( ).TryParse ( actionContext.Request, out model) )
{
bindingContext.Model = model;
return true;
}
else
{
bindingContext.ModelState.AddModelError( bindingContext.ModelName, "Cannot convert request to MyComplexType");
return false;
}
}
return false ;
}
以下是参考文档:http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api