如果提供了部分但不是全部可选参数,则调用错误的方法
本文关键字:参数 调用 方法 错误 全部 如果 | 更新日期: 2023-09-27 18:27:05
我对同一个页面有两个操作方法,一个使用GET进行初始加载,另一个使用POST进行表单提交,表单提交应该重定向到另一个页面。这两个调用都需要url中的一个强制参数,还可以从查询字符串中获取两个可选参数。
让我们调用可选参数oPar1
和oPar2
,它们作为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添加到混合物中之前,此设置一直有效。我是不是在做什么傻事?
您不更改可选参数,为什么需要传递它们?
如果您绝对需要,可以在视图模型中添加这两个属性属性(oPar1
和oPar2
),并以隐藏的形式显示它们。
然后在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仍然有点奇怪。我本以为,如果其中一个可选参数的格式错误,它就会被忽略。我很想知道是否有其他人能证实这种行为。
感谢所有发表评论的人。