-1

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

让我们调用可选参数oPar1,并将oPar2它们作为 GET 方法的参数以任意组合方式获取。这些被添加到页面使用的 ViewModel 中。

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

@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 添加到组合之前,此设置一直有效。我在这里做的事情真的很愚蠢吗?

4

2 回答 2

0

You don't change your optional parameters so why do you need to pass them?

If you absolutely need this you can add those two properties properties (oPar1 and oPar2) in your view-model and display them in the form as hidden.

Then in your POST action you use your view-model as a parameter:

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

By doing this you don't need to add an extra route for your POST requests (because it will match the default ASP.Net MVC route).

In case you did this to keep a clean URL and SEO-friendly URL for your POST request keep in mind that those URLs will never be displayed, that's called from a form submission and then can use the default route.

于 2013-08-08T15:25:25.117 回答
0

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

在 GET 期间传递给页面的 ViewModel 使用Uri对象而不是字符串来表示oPar1. action 属性仍然是写的,所以传递给 POST 的对象是 aUri而不是 a string。可以理解,活页夹不会自动将其转换Uri为 a string。将模型转换为使用字符串而不是 Uri 对象使一切再次正常工作。

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

感谢所有评论的人。

于 2013-08-09T08:28:36.733 回答