Как мне создать httppost, получающий те же параметры из httpget? - PullRequest
7 голосов
/ 13 декабря 2010

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

Ответы [ 5 ]

19 голосов
/ 02 ноября 2012

Использовать атрибут [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))
    { ... }
}
2 голосов
/ 03 мая 2012

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

2 голосов
/ 13 декабря 2010

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

<% 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" />
<% } %>
1 голос
/ 18 июля 2012

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

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

[HttpPost]
public ActionResult UpdateUserPost(int id)
{
    // Do work here
    RedirectToAction("ViewCustomer", new { customerID : id });
}
0 голосов
/ 13 декабря 2010

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

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

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

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

    return View();
}
...