如何通过AJAX将已填充的自定义类从javascript传递到.NETMVC应用程序

How do I get pass a populated custom class from javascript through AJAX to .NET MVC app?

本文关键字:javascript 应用程序 NETMVC 自定义 AJAX 何通过 填充      更新时间:2023-09-26

我在c#中有以下.net类:

public class BusinessModel
{
    public string BlobName { get; set; }
    public string NewName { get; set; }
}

在我的MVC Ajax控制器中,我有以下操作:

[HttpPost]
public ActionResult DoBusiness(string handle, BusinessModel businessData)
{
    // Do stuff with the business data.
}

首先,我尝试使用以下Javascript代码来调用它:

var bd = JSON.stringify({ BlobName: "blob", NewName: "new" });
$.ajax({
    type: "POST",
    url: "/Ajax/DoBusiness",
    data: { handle: "MyHandle", businessData: bd },
    success: businessComplete,
    error: businessFailed
});

在这种情况下,使用fiddler来查看,以下是数据在请求中的呈现方式:

handle=MyHandle&businessData=%7B%22BobName%22%3A%22Bob%22%2C%22NewName%22%3A+22new%22%7D

以下是解码的:

handle=MyHandle&businessData={"blob名称":"blob","NewName":"new"}

但是,当我使用Visual Studio调试器查看实际传递给控制器操作的值时,参数"handle"的值是预期的"MyHandle",但参数"businessData"的值为null。

现在,我将Javascript代码修改为如下(仅删除JSON.stringify调用):

var bd = { BlobName: "blob", NewName: "new" };
$.ajax({
    type: "POST",
    url: "/Ajax/DoBusiness",
    data: { handle: "MyHandle", businessData: bd },
    success: businessComplete,
    error: businessFailed
});

在这种情况下,数据(由fiddler显示)在请求中呈现为:

handle=MyHandle&businessData%5 blob名称%5D=blob&businessData%5新名称%5D=新

以下是解码的:

handle=MyHandle&businessData[BlobName]=blob&businessData[NewName]=新

在这种情况下,Visual Studio调试器仍然显示"handle"按预期设置为"MyHandle",但"businessData"参数不是null,而是用实际实例填充,但属性"BlobName"answers"NewName"都设置为null。

最后一个问题是:我做错了什么?如何在控制器操作中正确填充该类?

编辑针对可能重复的评论:标题为"通过POST(ajax)发送JSON数据并从Controller(MVC)接收JSON响应"的可能重复特别说明了如何发送与MVC绑定的模型实例。我的问题更多地与可能绑定MVC的对象无关。我很好奇如何填充任意提供的ANY对象。

编辑回应Stephen的评论:这是一个简化的场景。现实生活中的实际用例有一组重叠的Ajax调用,调用这个调用是为了响应前一个调用,该调用传递了在服务器上构建的任意对象,它希望在随后的调用中返回该对象(本例)。在我看来,提供一个充实的现实生活用例会使这个问题变得过于冗长,所以请原谅这种简化,我希望这种解释将有助于适当地构建上下文。

请参阅Stephan Muecke的评论。他给出了至少目前有效的答案。