Mvc Html.ActionButton

前端 未结 7 1990
鱼传尺愫
鱼传尺愫 2020-12-16 01:52

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.

7条回答
  •  悲哀的现实
    2020-12-16 02:18

    The easiest way to do it is to have a small form tag with method="get", in which you place a submit button:

    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.

提交回复
热议问题