将对象从AngularJS传递到ASP.NET MVC控制器不起作用

时间:2018-04-05 14:53:17

标签: c# asp.net angularjs asp.net-mvc-5

我将数据从angularJS发送到MVC控制器(我看到angularJS函数具有参数值,但在MVC控制器端,值为null ,我没有线索为什么会这样......)

//在angularJS控制器中运行

//initialize model
var model = {};
model.Name = "some string";
save(model, onSaveSuccess, onSaveError);
...

//post to MVC controller...
function save(model, success, error) {
    //name **has** value!
    return $http.post('/Test/Save', { params: { model: model } })
        .success(function (data) { errorHandler.jsonError(data, success, error); })
        .error(function (data, status) { errorHandler.httpError(data, status, error); });
}

// MVC控制器端(TestController)

[HttpPost]
public JsonResult Save(SaveModel model) //SaveModel is a class that has Name property of type string
{
    //when debug reaches -> name is null...
    //...
}

在该解决方案中,还有其他情况下,数据以类似的方式保存,并且在那里工作......任何想法要检查什么,或者可能出错?我是angularjs的新手,也许我错过了一些非常简单的东西......

P.S。

1)如果我改变" params:"到"数据:"建议的结果是相同的

2)如果我删除" params:"然后我得到500 error。即更改: { params: { model: model } } - > { model: model }

问题/解决方案

所以,问题结果是 客户端和服务器端

1)在客户端我必须更改{ params: { model: model } } - > model

建议的StriplingWarrior

2)在服务器端,我的model继承自BaseModel,它在其构建器中设置了一些与本地化相关的内容......并且它在我的机器上失败了。问题在于,当调试MVC控制器时 - >这个BaseClass代码在它之前执行过,所以它对我来说是隐藏的。我还不熟悉浏览器Developer Tools,所以我没有在正确的地方寻找信息 - >当我转到Network标签(Chrome Developer tools)时,我可以获得服务电话的异常信息。

Here is a similar case answered on SO. I seem to follow same rules without success

3 个答案:

答案 0 :(得分:2)

post的第二个参数是您要发布的实际数据有效负载,因此您需要删除params属性并将其对象提升到顶层。

function save(name, success, error) {
    //name **has** value!
    return $http.post('/Test/Save', { name: name })
        .success(function (data) { errorHandler.jsonError(data, success, error); })
        .error(function (data, status) { errorHandler.httpError(data, status, error); });
}

更新

根据您更新的代码,您应该直接将模型作为请求的正文传递:

function save(model, success, error) {
    //name **has** value!
    return $http.post('/Test/Save', model)
        .success(function (data) { errorHandler.jsonError(data, success, error); })
        .error(function (data, status) { errorHandler.httpError(data, status, error); });
}

答案 1 :(得分:-1)

我几乎100%确定你需要在你的JSON.stringify()对象上使用name方法,因为直接传递它就不会把你的字符串放在撇号中,这是MVC需要处理的此值为字符串对象。

请查看浏览器在Developer tools'网卡中确切发送的内容,以确认我的理论。

答案 2 :(得分:-1)

我不确定它是否有效,但您可以尝试更改此

public JsonResult Save(string name) 

public JsonResult Save([FromBody]string name) 

当参数名称不为空时,您可以检查它的值并相应地改变角度部分