Хотя решение, предоставленное Райаном, может работать, это все равно, что использовать молоток, чтобы ударить муху.
Проблема заключается в том, что TagBuilder кодирует строки во время вызовов MergeAttributes (). Для необходимого Javascript в ссылке кнопки это влияет на одинарные кавычки и пробелы.
Последним шагом требуемого метода расширения является возврат MvcHtmlString
(который не получает дальнейшей кодировки), поэтому вполне разумно внести некоторые простые текстовые исправления в строку (чтобы отменить кодировку) перед созданием этого объект.
, например
return new MvcHtmlString(tb.ToString(TagRenderMode.Normal).Replace("'", "\'").Replace(" "," "));
Полный помощник ActionLinkButton показан ниже:
public static class ActionLinkButtonHelper
{
public static MvcHtmlString ActionLinkButton(this HtmlHelper htmlHelper, string buttonText, string actionName, object routeValuesObject = null, object htmlAttributes = null)
{
return ActionLinkButton(htmlHelper, buttonText, actionName, "", routeValuesObject, htmlAttributes);
}
public static MvcHtmlString ActionLinkButton(this HtmlHelper htmlHelper, string buttonText, string actionName, string controllerName, object routeValuesObject = null, object htmlAttributes = null)
{
if (string.IsNullOrEmpty(controllerName))
{
controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
RouteValueDictionary routeValues = new RouteValueDictionary(routeValuesObject);
RouteValueDictionary htmlAttr = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
TagBuilder tb = new TagBuilder("button");
tb.MergeAttributes(htmlAttr, false);
string href = UrlHelper.GenerateUrl("default", actionName, controllerName, routeValues, RouteTable.Routes, htmlHelper.ViewContext.RequestContext, false);
tb.MergeAttribute("type", "button");
tb.SetInnerText(buttonText);
tb.MergeAttribute("value", buttonText);
tb.MergeAttribute("onclick", "location.href=\'"+ href +"\';return false;");
return new MvcHtmlString(tb.ToString(TagRenderMode.Normal).Replace("'", "\'").Replace(" "," "));
}
}
Это делает все, что вам нужно для добавления ссылок на кнопки, имеет наиболее полезные перегрузки, которые вы используете с ActionLink
, и не может привести к неожиданным изменениям в масштабах всего приложения путем изменения процесса кодирования атрибута.