ajax调用Controller Action,Object为参数

时间:2016-03-03 17:28:40

标签: javascript c# asp.net ajax asp.net-mvc

我在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上查看该变量包含我要查找的所有数据。实际上,如果我只是传递了对象的一个​​属性,它就会很好地进入控制器,但是我无法通过整个对象......

2 个答案:

答案 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