如何将 javascript 对象传递给 C# MVC 4 控制器

Posted

技术标签:

【中文标题】如何将 javascript 对象传递给 C# MVC 4 控制器【英文标题】:How to pass a javascript object to a C# MVC 4 controller 【发布时间】:2015-03-05 22:20:42 【问题描述】:

在 MVC4 中,如何将 javascript 对象传递给 AJAX 中的 C# 控制器? 最后我尝试了这个,但没有成功。

Javascript 客户端:

    var myData = Propr1: '', Propr2: '';
    $.ajax(
        type: 'POST',
        data: JSON.stringify(myData),
        url: '/Home/SubmitMyData',
        contentType: 'application/json',
        dataType: 'json',
        success: alert('Youhou'),
        error: alert('not good')
    );

C# 服务器端方法:

    public ActionResult SubmitMyData(MyParamModel myParam)
    
        // Do my stuff here with my parameter
        return View();
    

    public class MyParamModel
    
        string Prop1  get; set; 
        string Prop2  get; set; 
    

我的参数始终为空。我试图更改 contentType 但它仍然无法正常工作。 我的错误在哪里?我找到了一些帖子,但我没有发现我做错了什么。

非常感谢。

【问题讨论】:

[msdn.microsoft.com/en-us/magazine/hh781022.aspx](model binding) 有助于了解基础知识 【参考方案1】:
    确保 javascript 和 C# 模型之间的属性名称匹配。在您的问题中,您的 javascript 对象有 Propr1Propr2,但在 C# 模型中,您有 Prop1Prop2(缺少“r”)。 发送前不要stringify数据,也不要将dataType设置为json。 MVC 可以很好地解析一组 post 参数,而无需在代码中进行 json 序列化。 省略contentType,没有必要。 WebAPI 应该自动检测到这一点。你可以留下它,但它是无关紧要的。 确保模型属性是公开的。

Javascript 客户端:

    var myData = Prop1: '', Prop2: ''; // #1
    $.ajax(
        type: 'POST',
        data: myData, // #2
        url: '/Home/SubmitMyData',
        //contentType: 'application/json', #3
        //dataType: 'json', #2
        success: alert('Youhou'),
        error: alert('not good')
    );

C# 服务器端方法:

    public ActionResult SubmitMyData(MyParamModel myParam)
    
        // Do my stuff here with my parameter
        return View();
    

    public class MyParamModel // #4
    
        public string Prop1  get; set; 
        public string Prop2  get; set; 
    

【讨论】:

您能否发布一个关于问题所在以及您的代码为何有效的简短说明? 我认为 FromBody 属性在这里不合适。 OP 使用的是 MVC 4,而不是 Web API。 @DavidL 感谢您指出这一点,由于标题,我认为这是一个 WebAPI 问题。 @danludwig 好点。也许OP应该稍微调整一下标题:)。 抱歉标题。我又试了一次,它对我不起作用:s 我的参数仍然为空【参考方案2】:

您为data 属性传递的值应该是一个对象,而不是一个字符串:

data: myData,

属性名称需要匹配:

var myData =  Prop1: '', Prop2: '';

您需要在参数值上使用[FromBody] 属性:

public ActionResult SubmitMyData([FromBody] MyParamModel myParam)

并且你的模型类型的属性需要是public:

public class MyParamModel

    public string Prop1  get; set; 
    public string Prop2  get; set; 

【讨论】:

以上是关于如何将 javascript 对象传递给 C# MVC 4 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript

如何将 C++ 对象传递给 C# 类库

将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序

如何使用asp.net c#将HTML格式的电子邮件正文传递给javascript函数

如何将 swift 对象传递给 javascript (WKWebView / swift)

如何将 javascript 对象传递给 VueJS 中的组件?