Mat*_*att 2 c# asp.net-mvc post asp.net-mvc-4
我正在使用MVC 4 Web API项目(ASP.NET)在C#中编写API层.
我在我的控制器中写了一个测试动作,如下所示:
[System.Web.Mvc.HttpPost]
public string TestAction(FormCollection fc)
{
return "test";
}
Run Code Online (Sandbox Code Playgroud)
我在FireFox中使用Poster测试表单帖子:
这是我的路线:
RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");
Run Code Online (Sandbox Code Playgroud)
我可以张贴从海报的URL和参数时没有问题,达到控制,但如果我把一个断点return "test";,然后将鼠标悬停在FormCollection在(传递fc),它表明字符串空数组中获得通过,而不是我的价值观(例如string[0]).
我已经$.post()在客户端使用jQuery完成了这么多次,没有收到表单集合的问题.
在这种情况下失败了什么?
谢谢,
马特
看来这是在API控制器(ApiController)中定义的动作.如果是这种情况你不能使用FormCollection.这用于正常的控制器操作,而不是API控制器(我个人不会在正常的控制器操作中使用它,但这是另一个主题,请参阅下一段以了解我正在使用的内容).
您应该定义一个视图模型:
public class MyViewModel
{
public string Foo { get; set; }
public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后让控制器操作将此视图模型作为参数:
public class TestController: ApiController
{
[System.Web.Http.HttpPost]
public string TestAction(MyViewModel model)
{
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,API控制器的正确属性[System.Web.Http.HttpPost]与[System.Web.Mvc.HttpPost]代码中的属性不同.
另外我建议你坚持使用RESTful约定:
RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}");
Run Code Online (Sandbox Code Playgroud)
然后:
public class TestController: ApiController
{
public string Post(MyViewModel model)
{
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
现在,HTTP Verb(在本例中为POST)确定要调用的控制器操作:
POST /test
Server: http://example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Connection: close
foo=bar&bar=foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4338 次 |
| 最近记录: |