ASP.NET MVC 3: Как заставить ActionLink выполнять HttpPost вместо HttpGet?

Можно ли заставить@Html.ActionLink() сделатьPOST вместоGET? Если так, то как?

 VJAI15 июл. 2012 г., 08:20
Нет, вы не можете это сделать только для GET

Ответы на вопрос(5)

Невозможно иметь<a> Элемент выполнения POST для веб-сервера.

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

Вы должны использовать<a> элемент, или просто то, чтоresembles <a> элемент?

Также стоит упомянуть, чтобы взглянуть наAjaxLink, Это позволяет легко использовать<a> элемент для выполнения AJAX POST.

Что бы я сделал, это обернул ваш HTML вокруг формы

@using(Html.BeginForm("YourAction","YourController", FormMethod.Post)){

<button>Hello</button>

}

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

Если вы действительно хотите использовать ссылку, вам может понадобиться JavaScript

Что-то вроде этого:

$("#idOfYourLink").click(function(){
var form = $(this).parents('form:first');
form.submit();
});

Я полагаю, что если вам нужно что-то подобное для Действия, которое будет делать что-то «постоянное» на стороне сервера. Например, удаление объекта в базе данных.

Вот полный пример удаления по ссылке и публикации: http://www.squarewidget.com/Delete-Like-a-Rock-Star-with-MVC3-Ajax-and-jQuery

From the previous link (recomended reading anyway):

Ссылка для удаления по вашему мнению:

@Ajax.ActionLink("Delete", "Delete", "Widget",
                new {id = item.Id},
                new AjaxOptions {
                    HttpMethod = "POST",
                    Confirm = "Are you sure you want to delete this widget?",
                    OnSuccess = "deleteConfirmation"
                }) 

Немного JS:

function deleteConfirmation(response, status, data) {

        // remove the row from the table
        var rowId = "#widget-id-" + response.id;
        $('.widgets').find(rowId).remove();

        // display a status message with highlight
        $('#actionMessage').text(response.message);
        $('#actionMessage').effect("highlight", {}, 3000);
    }
 26 апр. 2013 г., 14:52
Ссылка обновлена ...
 wgpubs17 июл. 2012 г., 06:45
отличная ссылка. Если бы я мог пометить 2 ответа как правильные, то, надеюсь, будет достаточно upvote. Спасибо
 26 апр. 2013 г., 10:16
Ссылка больше не работает
Решение Вопроса

ActionLink вспомогательный метод будет оказыватьanchor тег, нажав на который всегдаGET запрос. Если вы хотите сделать этоPOST запрос. Вы должны переопределить behviour по умолчанию, используя небольшой javacsript

@ActionLink("Delete","Delete","Item",new {@id=4},new { @class="postLink"})

Теперь некоторыеjQuery код

<script type="text/javascript">
  $(function(){
    $("a.postLink").click(function(e){
      e.preventDefault();
      $.post($(this).attr("href"),function(data){
          // got the result in data variable. do whatever you want now
          //may be reload the page
      });
    });    
  });    
</script>

Убедитесь, что у вас естьAction методHttpPost тип для обработки этого запроса

[HttpPost]
public ActionResult Delete(int id)
{
  // do something awesome here and return something      
}

Если вы думаете ... в HTML нет тега для ссылки, которая делает POST. И именно поэтому вы не можете принудительно заставить ссылку делать POST (а это не имеет никакого смысла). Чтобы использовать «POST», вы должны «POST» что-то. И это что-то должно быть формой, или вы можете сделать POST, используя функцию Javascript для AJAX. В любом случае, если вам нужно POST без публикации чего-либо, вы должны просмотреть свою модель ресурса, что-то воняет.

Ваш ответ на вопрос