如何创建一个接受HTTP-POST数据的简单ASP.NET MVC操作方法?

时间:2010-01-13 06:10:03

标签: asp.net asp.net-mvc fiddler

我希望在我的控制器中有一个简单的Action,它接受一些可选值和一些整数值。

这是我希望拥有的路线:

HTTP.POST
/review/create

这是我想要的Action方法......

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult Create(int userId,
                         int addressId,
                         byte baseScore,
                         byte reviewType,
                         string subject,
                         string description)
{ ... }

我有一种没有受过教育的印象,即上面所有这些论点都将由表单集合值填充......但它并没有发生。另外,我不知道如何写一条路线来处理那些...因为这些值是形式后数据....

这是我的global.asax ....

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // Api - Search methods.
    routes.MapRoute(
        "Search Methods",
        "{controller}/{action}"
    );

实际上,从不调用action方法,因为它似乎找不到它:(

但是,如果没有任何这些参数的创造和行动,那么它会找到它??????????

您如何编写路线和操作方法来接受路径/评论/创建的一些必需参数和一些可选参数?

4 个答案:

答案 0 :(得分:0)

据我所知,您可以像这样重写控制器操作:

public ActionResult Create(int foo, int bar, byte blah, string name, int? xxx) {
    // code here
}

然后,ModelBinder将确保设置foo,bar和blah。名称和xxx可以为null。我暂时无法测试它,但我认为动作的返回类型应为ActionResult

答案 1 :(得分:0)

如果您正在POST表单,请确保表单中的元素(文本框,复选框,文本区等)的id与您方法中的参数匹配。作为替代方法,您可以将FormCollection传递给方法,并执行myFormCollection["foo"]以获取值的字符串表示形式(然后可以将其解析为int)。

答案 2 :(得分:0)

根据我的经验,您在这个问题上缺少一些关键要素和概念。

首先,我不相信你可以在没有表格的情况下执行POST。表单必须包含控件,您可以从中获取传递给控制器​​方法的值。如果目标是简单地对您的POST控制器方法进行单元测试,那么只需在您的测试中直接调用该方法,根据您的一条评论,您可能会看到该方法。如果您涉及视图,那么您正在进行集成测试,而不是单元测试。无论测试类型如何,测试都将失败,因为您选择不构建表单。即使你设法使用Fiddler,Firebug或任何其他机制强制POST,你仍然没有测试视图,你正在测试HTTP协议。

我强烈建议您使用网络应用程序测试工具(例如WatiNSelenium)来测试您的网页,而不是将一个快速而肮脏的测试放在一起t测试任何有用的东西。

答案 3 :(得分:0)

在您的帖子请求中设置content-type =“application / json; charset = UTF-8”并以JSON格式传递method参数的值。这应该使Asp.MVC不要在FormCollection中查找这些值。