0

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

这是我希望拥有的路线:

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 方法永远不会被调用,因为它似乎没有找到它:(

但是,如果 create 和 action 没有任何这些参数,那么它会找到它?????????

您将如何编写路由和操作方法来接受路由 /review/create 的一些要求和一些可选参数?

4

4 回答 4

0

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

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

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

于 2010-01-13T08:48:42.870 回答
0

如果您要发布表单,只需确保表单中的元素(文本框、复选框、文本区域等)的 id 与您方法中的参数匹配。作为替代方案,您可以将 a 传递FormCollection给该方法,并myFormCollection["foo"]获取该值的字符串表示形式(然后可以将其解析为 int)。

于 2010-01-13T08:53:42.907 回答
0

根据我的经验,您在这个问题上遗漏了许多关键要素和概念。

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

我强烈建议您使用 Web 应用程序测试工具,例如WatiNSelenium来测试您的网页,而不是拼凑一个真正无法测试任何有用的快速而肮脏的测试。

于 2010-01-14T06:01:16.223 回答
0

在您的发布请求中设置 content-type="application/json; charset=UTF-8" 并以 JSON 格式传递方法参数的值。这应该使 Asp.MVC 不在 FormCollection 中查找这些值。

于 2010-01-14T21:06:33.490 回答