如果提供了部分但不是全部可选参数,则调用错误的方法

本文关键字:参数 调用 方法 错误 全部 如果 | 更新日期: 2023-09-27 18:27:05

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

让我们调用可选参数oPar1oPar2,它们作为GET方法上的参数在任何组合中都很好。这些将添加到页面使用的ViewModel中。

POST需要为操作方法提供参数,因此在表单标签的action属性中,我们有:

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

不用说,该方法也被设置为post

当我在GET中只提供两个可选参数中的一个时,问题就来了。当按下提交按钮时,似乎调用了GET方法,而不是POST。如果我同时提供两个可选参数,或者根本不提供,那么POST就会被调用为fine,并且我会按预期获得参数。

函数声明为:

[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添加到混合物中之前,此设置一直有效。我是不是在做什么傻事?

如果提供了部分但不是全部可选参数,则调用错误的方法

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

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

然后在POST操作中,使用视图模型作为参数:

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

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

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

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

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

话虽如此,调用GET方法而不是POST仍然有点奇怪。我本以为,如果其中一个可选参数的格式错误,它就会被忽略。我很想知道是否有其他人能证实这种行为。

感谢所有发表评论的人。