Has anyone written one? I want it to behave like a link but look like a button. A form with a single button wont do it has I don't want any POST.
Html. ActionLink creates a hyperlink on a view page and the user clicks it to navigate to a new URL. It does not link to a view directly, rather it links to a controller's action.
The easiest way to do it is to have a small form
tag with method="get"
, in which you place a submit button:
<form method="get" action="/myController/myAction/">
<input type="submit" value="button text goes here" />
</form>
You can of course write a very simple extension method that takes the button text and a RouteValueDictionary
(or an anonymous type with the routevalues) and builds the form so you won't have to re-do it everywhere.
EDIT: In response to cdmckay's answer, here's an alternative code that uses the TagBuilder
class instead of a regular StringBuilder
to build the form, mostly for clarity:
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;
namespace MvcApplication1
{
public static class HtmlExtensions
{
public static string ActionButton(this HtmlHelper helper, string value,
string action, string controller, object routeValues)
{
var a = (new UrlHelper(helper.ViewContext.RequestContext))
.Action(action, controller, routeValues);
var form = new TagBuilder("form");
form.Attributes.Add("method", "get");
form.Attributes.Add("action", a);
var input = new TagBuilder("input");
input.Attributes.Add("type", "submit");
input.Attributes.Add("value", value);
form.InnerHtml = input.ToString(TagRenderMode.SelfClosing);
return form.ToString(TagRenderMode.Normal);
}
}
}
Also, as opposed to cdmckay's code, this one will actually compile ;) I am aware that there might be quite a lot of overhead in this code, but I am expecting that you won't need to run it a lot of times on each page. In case you do, there is probably a bunch of optimizations that you could do.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With