'post action for url.action?

Here is a line of code in my Controller class:

return JavaScript(String.Format("window.top.location.href='{0}';", Url.Action("MyAction", "MyController")))

Is there a way to make it use the verb=post version of MyAction?



Solution 1:[1]

I came across the same problem myself and solved it using a data- attribute and some jQuery. The benefit of doing it this way is that you still get the correct URL when you hover over the link, even though it does a POST. Note that the Html.BeginForm contains the default action in case the user hits the enter key.

HTML (ASP.NET MVC3 Razor)

@using (Html.BeginForm("Quick", "Search"))
{
    <input type="text" name="SearchText" />
    <a href="@Url.Action("Quick", "Search")" data-form-method="post">Search</a>
    <a href="@Url.Action("Advanced", "Search")" data-form-method="post">Advanced</a>
}

jQuery

$("a[data-form-method='post']").click(function (event) {
    event.preventDefault();
    var element = $(this);
    var action = element.attr("href");
    element.closest("form").each(function () {
        var form = $(this);
        form.attr("action", action);
        form.submit();
    });
});

Solution 2:[2]

Continuing off of Matt Lacey's answer, your action could return a bit of Javascript that does this:

  1. Use jquery to add a new form to the DOM
  2. Use jquery to submit the newly added form

Something like this: (untested code)

var urlHelper = new UrlHelper(...);
var redirectUrl = urlHelper.Action("MyAction", "MyController");

var redirectScript = String.Format(@"
    var formTag = $('<form action=""{0}"" method=""post"" id=""redirectForm""></form>');
    $(body).append(formTag);
    formTag.submit();"
    , redirectUrl
);

return JavaScript(redirectScript);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Oundless
Solution 2 Seth Petry-Johnson