【问题标题】:Is there a way to pass a "C#" object to a controller via AJAX?有没有办法通过 AJAX 将“C#”对象传递给控制器​​?
【发布时间】:2011-07-20 18:54:13
【问题描述】:

通过 jQuery ajax 将字符串传递给控制器​​动作很简单,但是是否可以将一组变量序列化为一个对象,将其发送给控制器,并让控制器将其识别为对象?

例如:

在服务器中,你有一个 Obj 类:

class Obj{
    string a; int b; double c;
}

在控制器中,你有一个方法,它需要一个 Obj 对象

public JsonResult UpdateObj(Obj obj){
    //stuff
}

在 Jquery 中有没有办法将一些 JavaScript 变量序列化为类 Obj,然后通过 AJAX 帖子将其发送到 MVC 控制器操作?

【问题讨论】:

  • 它已经内置在 MVC 3 中。JSON 请求只需要匹配您的 Obj 中的属性,modelbinder 将为您绑定值。

标签: asp.net-mvc-3 jquery razor


【解决方案1】:

当然,假设您有一个强类型视图:

@model Obj

<script type="text/javascript">
    // Serialize the model into a javascript variable
    var model = @Html.Raw(Json.Encode(Model));

    // post the javascript variable back to the controller 
    $.ajax({
        url: '/home/someAction',
        type: 'POST',  
        contentType: 'application/json; charset=utf-8',
        data: JSON.serialize(model),
        success: function(result) {
            // TODO: do something with the results
        }
    });
</script>

在控制器动作中:

public ActionResult SomeAction(Obj obj)
{
    ...
}

只是对这个 Obj 的一个评论,让它有公共属性而不是一些字段:

public class Obj
{
    public string A { get; set; }
    public int B { get; set; }
    public double C { get; set; }
}

【讨论】:

  • @Robert Harvey,一无所有,ASP.NET MVC 3 为您做到了。
  • 整个 Html.Raw 看起来很稳定,但是在对模型进行编码时出现语法错误。
  • 如果我尝试按原样运行该代码,我会收到服务器错误“序列化 TitleDataEntity 类型的对象时检测到循环引用”,这是我需要序列化的实际对象。
  • @Jay Sun,这很正常,您的视图模型中不应有循环引用。不可能对包含循环引用的对象进行 JSON 序列化。这不受支持,无论如何都是一个坏主意。您永远不应该将任何 EF 域模型传递给您的视图。您应该使用和定义专为满足您的视图要求而设计的视图模型。
  • 啊,我明白了。感谢您的提示。
【解决方案2】:

jQuery :::

.ajax{
     type: "POST",
     url: "yourUrl/UpdateObj",
     data: $("someHTMLForm").serialize(),
     contentType: "application/json; charset=utf-8"
     success: function(data){
           //data will house your JsonResult
     }
}

【讨论】:

  • 不需要反序列化。 application/json contentType 告诉 MVC 通过动态序列化器(System.Web.Services.Script.JavaScriptSErializer 类)将 JSON 对象与您的 .NET 对象匹配
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多