Как создать httppost, получая те же параметры из httpget?

У меня есть контроллер, чтобы показать модель (Пользователь) и хотят создать экран с кнопкой активации. Мне не нужны поля в форме. У меня уже есть идентификатор в URL. Как я могу это сделать?

5 ответов


Вы можете использовать скрытое поле в форме:

<% 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" />
<% } %>

использовать атрибут [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))
    { ... }
}

немного поздно для партии на этом, но я нашел более простое решение того, что я думаю, является довольно распространенным случаем использования, когда вы предлагаете 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.В пустые места "" потому что это должна быть константа времени компиляции. И это отличное место, чтобы поставить Смешные комментарии для кого-то еще, чтобы найти:)


мой подход не заключается в добавлении неиспользуемого параметра, поскольку это, похоже, вызовет путаницу и в целом плохая практика. Вместо этого я добавляю "Post" к моему имени действия:

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

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

самый простой способ для такой простой ситуации-дать имя для отправки кнопки и проверить действие, если оно имеет значение или нет. Если он имеет значение, то это действие Post, если нет, то он получает действие:

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

для Cs вы можете объединить методы get и post controller в одном:

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

    return View();
}