C# ASP.NETMVC使用ajax将整个模型传递给控制器

C# ASP.NETMVC使用ajax将整个模型传递给控制器,c#,asp.net,asp.net-mvc,datatables,C#,Asp.net,Asp.net Mvc,Datatables,如何使用ajax将视图的模型传递给控制器?请参见下面的JS函数CreateTable(): 我的控制器: public ActionResult Index() { var viewModel = new MyViewModel(); return View(viewModel); } [HttpPost] public ActionResult Index(MyViewModel viewModel) { //CODE FOR GETTING STUFF HERE

如何使用ajax将视图的模型传递给控制器?请参见下面的JS函数CreateTable():

我的控制器:

public ActionResult Index()
{
    var viewModel = new MyViewModel();

    return View(viewModel);
}

[HttpPost]
public ActionResult Index(MyViewModel viewModel)
{
    //CODE FOR GETTING STUFF HERE

    return View(viewModel);
}

public JsonResult GetResult(JQueryDataTableParamModel param, MyViewModel viewModel)
{
    //CODE FOR GETTING STUFF HERE

    return Json(new
    {
        sEcho = param.sEcho,
        aaData = viewModel.Data,
        iTotalRecords = viewModel.Data.Rows.Count,
        iTotalDisplayRecords = viewModel.DisplayRecords
    }, JsonRequestBehavior.AllowGet);
}
下面是datatables.net处理的ajax部分:

function CreateTable() {
    var table = $('#dataTable').DataTable({
        "deferRender": true,
        "bServerSide": true,
        "sAjaxSource": "@Url.Action("GetResult")",
        "fnServerParams": function (aaData) {
            //here's my problem: HOW CAN I PUSH MY WHOLE MODEL HERE?
            aaData.push({ "name": "MyViewModel", "value": "@Model" });
        },
        "sPaginationType": "simple_numbers",
        "bProcessing": true,
        "oLanguage": { "sProcessing": "Loading..." },
        "aoColumns": [
            { "sName": "Col1" },
            { "sName": "Col2" },
            { "sName": "Col3" },
            { "sName": "Col3" },
            { "sName": "Col4" },
            { "sName": "Col5" }
        ]
    });
}

我的朋友告诉我,我也可以将整个模型从ajax传递到我的控制器,但我不知道如何做到这一点。请告知更好的实施方式。多谢各位

您可以使用
@Html.Raw(JsonConvert.SerializeObject(model))
序列化您的模型,因此您的函数如下所示:

"fnServerParams": function (aaData) {

            aaData.push({ name: "viewModel", value: @Html.Raw(JsonConvert.SerializeObject(Model)) });
        },

只要传递与模型具有相同属性的json对象,您就应该是安全的,例如:

Model:

public class Language
    {
        public int ID { get; set; }
        public string Language1{ get; set; }
        public string Language2 { get; set; }
    }

Ajax:

$.ajax({
            url: '@Url.Action("Action", "Controller")',
            type: "POST",
            contentType: 'application/json',
            data: JSON.stringify({
                ID: 1,
                Language1: "English",
                Language2: "German",
                         }),
            dataType: 'json',


            success: function (data) {
                alert(data)
            }
        });
使用时使用
aoData。按
向服务器发送自定义参数。我不确定是否将整个模型作为单个参数传递,但您可以这样做:

aoData.push({ "name": "customParam1", "value": $('#param1').val() });
aoData.push({ "name": "customParam2", "value": $('#param2').val() });
其中
param1
param2
是从jQuery选择器检索的模型属性

控制器方法需要从querystring中检索这些参数。大概是这样的:

aoData.push({ "name": "customParam1", "value": $('#param1').val() });
aoData.push({ "name": "customParam2", "value": $('#param2').val() });
创建一个表示自定义参数的模型(在您的示例中,这基本上是复制
MyViewModel
):

在控制器中,解析查询字符串,获取自定义参数并将其分配给模型

public JsonResult GetResult(JQueryDataTableParamModel param)
{
    NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());

    var model = new MyCustomParamModel
    {
        customParam1 = qs["customParam1"],
        customParam2 = qs["customParam2"],
    }

现在,控制器中有了模型数据,可以对其执行任何操作。

如果要在javascript中使用模型,需要将其序列化为JSON。使用Json.net,您可能会使用类似于
@JsonConvert.SerializedObject(model)
的东西。我正在尝试Alex下面与您相同的答案,但我在JsonConvert中遇到编译错误。您需要获取
Newtonsoft.Json
nuget包,以便识别JsonConvert。感谢Alex抽出时间检查我的问题,我如何用我的控制器GetResult()捕捉到这一点?您不需要做任何特殊的事情。MVC模型绑定器将解决此模型。只需在方法中使用
viewModel
对象。它将包含您从clientJsonConvert传递的所有值,并从my end返回编译错误:(您的意思是
JsonConvert.SerializeObject(模型)
返回一个编译错误?谢谢,我明白了。但是如果我将MyCustomParamModel的属性作为DataTable怎么办?我该怎么做?假设MyCustomParamModel.customParam1是一个DataTable?我想你必须将其作为数组传递,或者以某种方式将其字符串化,我不确定如何或为什么要这样做。你能解释一下你的想法吗你想做什么?