如果提供了一些但不是所有可选参数,则调用错误的方法

时间:2013-08-08 15:19:15

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

我有两个针对同一页面的操作方法,一个使用GET进行初始加载,另一个使用POST进行表单提交,应该重定向到另一个页面。两个调用都需要url中的一个必需参数,并且还可以从查询字符串中获取两个可选参数。

让我们调用可选参数oPar1oPar2,这些参数在GET方法中作为参数被选中。这些将添加到页面使用的ViewModel中。

POST需要为action方法提供参数,所以在我们拥有的form标签的action属性中:

@Url.Action("PostAction", new { mPar = Model.mPar, oPar1 = Model.oPar1, oPar2 = Model.oPar2 })

毋庸置疑,该方法也设置为post

当我在GET中只提供两个可选参数中的一个时,问题出现了。按下提交按钮时,似乎调用了GET方法,而不是POST。如果我提供两个可选参数或者根本不提供任何参数,则POST被称为正常,我按预期获得参数。

函数声明是:

[HttpGet]
[RequireHttps]
public ActionResult GetAction(string mPar, string oPar1, string oPar2)

[HttpPost]
[RequireHttps]
public ActionResult PostAction(string mPar, MyModel model, string oPar1, string oPar2)

路线是:

routes.MapRoute(
    "GetActionRoute",
    "mycontroller/{mPar}/pageName",
    new { controller = "myController", action = "GetAction", mPar = UrlParameter.Optional },
    new { httpMethod = new HttpMethodConstraint("GET") });

routes.MapRoute(
    "PostActionRoute",
    "mycontroller/{mPar}/pageName",
    new { controller = "myController", action = "PostAction", mPar = UrlParameter.Optional },
    new { httpMethod = new HttpMethodConstraint("POST") });

值得补充的是,这个设置一直有效,直到我将oPar2添加到混音中。我在这里做些蠢事吗?

2 个答案:

答案 0 :(得分:0)

您没有更改可选参数,为什么需要传递它们?

如果您绝对需要,可以在视图模型中添加这两个属性属性(oPar1oPar2),并将其显示在隐藏的表单中。

然后在您的POST操作中,您将视图模型用作参数:

[HttpPost]
[RequireHttps]
public ActionResult PostAction(YourViewModel yourViewModel)

通过这样做,您不需要为POST请求添加额外路由(因为它将与默认的ASP.Net MVC路由匹配)。

如果您这样做是为POST请求保留一个干净的URL和SEO友好的网址,请记住,这些网址永远不会显示,而是来自form提交然后可以使用默认路由。

答案 1 :(得分:0)

我最终找到了解决方案,但我没有在问题中提供足够的信息供其他人回答。对不起。

在GET期间传递给页面的ViewModel使用Uri对象而不是字符串来表示oPar1。 action属性仍然是写入的,因此传递给POST的对象是Uri而不是string。可以理解的是,活页夹没有自动将Uri转换为string。将模型转换为使用字符串而不是Uri对象使一切都恢复正常。

说完这个之后,调用GET方法而不是POST是有点奇怪的。我原以为如果其中一个可选参数的格式错误,它将被忽略。我有兴趣知道是否有其他人可以证实这种行为。

感谢所有评论过的人。