Это правильный способ сделать это?
номер
Есть много проблем с вашим кодом, я не знаю с чего начать. Вы можете перейти непосредственно к концу моего ответа, где я представлю возможное улучшение вашего помощника, если вас не волнуют мои нападки, которые вот-вот последуют.
Вы никогда не должны жестко кодировать URL-адреса в приложении ASP.NET MVC. При работе с URL вы всегда должны использовать помощники по URL.
Так что вместо:
path = "../../Content/themes/" + Themes.brown .ToString()+ "/style.css";
вам следует использовать помощник по URL:
path = url.Content(string.Format("~/Content/themes/{0}/style.css", Themes.brown));
Очевидно, что то же самое замечание относится и к другим случаям переключения.
и затем заменить:
linkBuilder.MergeAttribute("href", "@Url.Content(" + path + ")");
с:
linkBuilder.Attributes["href"] = path;
Также весь ваш оператор switch может быть заменен одной строкой кода:
var path = url.Content(string.Format("~/Content/themes/{0}/style.css", theme));
Кроме того, вы, кажется, не делаете ничего полезного с созданной вами переменной linkBuilder
. Вы строите его и оставляете для сбора мусора, никогда не добавляя его в результат.
Другая проблема заключается в том, что вы никогда не устанавливаете контент для якоря. Вы просто генерируете пустое <a>
. Это то, что вы хотите?
Итак, подведем итог: вам нужно разделить их на 2 помощника:
Тот, который генерирует CSS <link>
для выбранной темы, и тот, который отображает якорь.
Давайте свернем их:
public static IHtmlString ThemeLink(this HtmlHelper html, Themes theme)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
var linkBuilder = new TagBuilder("link");
var path = url.Content(string.Format("~/Content/themes/{0}/style.css", theme));
linkBuilder.Attributes["href"] = path;
linkBuilder.Attributes["rel"] = "stylesheet";
linkBuilder.Attributes["type"] = "text/css";
return new HtmlString(linkBuilder.ToString(TagRenderMode.SelfClosing));
}
и кнопка:
public static IHtmlString EditButton(
this HtmlHelper html,
string action,
string controller,
bool state
)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
var htmlAttributes = new RouteValueDictionary(new
{
alt = "edit",
title = "Edit"
});
if (state)
{
htmlAttributes["class"] = "edit_active";
}
else
{
htmlAttributes["class"] = "edit_inactive";
}
return html.ActionLink(" ", action, controller, null, htmlAttributes);
}
и затем в вашем макете или выделенном разделе переопределения в вашем представлении для <head>
вы сначала включите правильный CSS:
@section Styles {
@Html.ThemeLink(Themes.brown)
}
и затем в вашем коде вы сгенерируете кнопки:
@Html.EditButton("myaction", "mycontroller", true)
@Html.EditButton("myaction", "mycontroller", false)
...