我有两个针对同一页面的操作方法,一个使用GET进行初始加载,另一个使用POST进行表单提交,应该重定向到另一个页面。两个调用都需要url中的一个必需参数,并且还可以从查询字符串中获取两个可选参数。
让我们调用可选参数oPar1
和oPar2
,这些参数在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添加到混音中。我在这里做些蠢事吗?
答案 0 :(得分:0)
您没有更改可选参数,为什么需要传递它们?
如果您绝对需要,可以在视图模型中添加这两个属性属性(oPar1
和oPar2
),并将其显示在隐藏的表单中。
然后在您的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是有点奇怪的。我原以为如果其中一个可选参数的格式错误,它将被忽略。我有兴趣知道是否有其他人可以证实这种行为。
感谢所有评论过的人。