如何创建从httpget获取相同参数的httppost?

时间:2010-12-13 13:03:34

标签: asp.net-mvc asp.net-mvc-2 c#-4.0 http-post http-get

我有一个控制器来显示模型(用户),并且想要创建一个只需要激活按钮的屏幕。我不想要表格中的字段。我已经在网址中有了id。我怎么能做到这一点?

5 个答案:

答案 0 :(得分:19)

使用[ActionName]属性 - 这样您可以让URL看起来指向相同的位置,但根据HTTP方法执行不同的操作:

[ActionName("Index"), HttpGet]
public ActionResult IndexGet(int id) { ... }

[ActionName("Index"), HttpPost]
public ActionResult IndexPost(int id) { ... }

或者,您可以在代码中检查HTTP方法:

public ActionResult Index(int id)
{
    if (string.Equals(this.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
    { ... }
}

答案 1 :(得分:2)

您可以在表单中使用隐藏字段:

<% using (Html.BeginForm()) { %>
    <%= Html.HiddenFor(x => x.Id) %>
    <input type="submit" value="OK" />
<% } %>

或在表单的操作中传递它:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
    <input type="submit" value="OK" />
<% } %>

答案 2 :(得分:2)

在这方面有点晚了,但我找到了一个更简单的解决方案,我认为这是一个相当常见的用例,你提示GET(“你确定要等等等等等等吗? >?“)然后使用相同的参数对POST进行操作。

解决方案:使用可选参数。不需要任何隐藏的领域等。

注意:我只在MVC3中测试过它。

    public ActionResult ActivateUser(int id)
    {
        return View();
    }

    [HttpPost]
    public ActionResult ActivateUser(int id, string unusedValue = "")
    {
        if (FunctionToActivateUserWorked(id))
        {
            RedirectToAction("NextAction");
        }
        return View();
    }

最后,您不能使用string.Empty代替"",因为它必须是编译时常量。这是一个很好的地方,可以让其他人找到有趣的评论:)

答案 3 :(得分:1)

我的方法是不添加未使用的参数,因为它似乎会引起混淆,并且通常是不好的做法。相反,我所做的是将“发布”添加到我的动作名称:

public ActionResult UpdateUser(int id)
{
     return View();
}

[HttpPost]
public ActionResult UpdateUserPost(int id)
{
    // Do work here
    RedirectToAction("ViewCustomer", new { customerID : id });
}

答案 4 :(得分:0)

这种简单情况的最简单方法是提供一个名称来提交按钮并检查其是否有价值。 如果它有值,那么它就是Post动作,如果没有,那么它就是Get动作:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
    <input type="submit" value="OK" name="btnActivate" />
<% } %>

对于Cs,您可以将get和post控制器方法合并为一个:

public ActionResult Index(int? id, string btnActivate)
{
        if (!string.IsNullOrEmpty(btnActivate))
        {
            Activate(id.Value);
            return RedirectToAction("NextAction");
        }

    return View();
}