Rod
Rod

Reputation: 15475

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?

Upvotes: 19

Views: 86156

Answers (4)

Boris
Boris

Reputation: 391

Here is the similar idea as Oundless proposed but simpler (no need for JS/jQuery code)

@{
  string ids = string.Join(",", new List<int>() {1, 2, 3});
}

@using (Html.BeginForm("MyAction", "MyController"))
{
  <div>
    @Html.Hidden("ids", ids, new { id = "search-ids" })
    <button type="submit">Action</button>
  </div>
}

Upvotes: 0

Matt Lacey
Matt Lacey

Reputation: 65566

You can't use POST by simply navigating to a different URL. (Which is what you'd do by changing location.href.)

Using POST only makes sense when submitting some data. It's not clear from your code what data would actually be POSTed.

If you really want to initiate a POST via javascript try using it to submit a form.

Upvotes: 20

Oundless
Oundless

Reputation: 5505

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();
    });
});

Upvotes: 20

Seth Petry-Johnson
Seth Petry-Johnson

Reputation: 12085

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);

Upvotes: 3

Related Questions