Выберите файл CSS для пользовательского элемента управления в ASP MVC - PullRequest
0 голосов
/ 06 марта 2012

У меня есть этот Html Helper

public static MvcHtmlString EditButton(this HtmlHelper html, string action,
        string controller, bool state, Themes theme)
    {
        var url = new UrlHelper(html.ViewContext.RequestContext);
        var linkBuilder = new TagBuilder("link");
        string path;

        switch (theme)
        {
            case Themes.brown:
                path = "../../Content/themes/" + Themes.brown .ToString()+ "/style.css";
                break;
            case Themes.darkblue:
                path = "../../Content/themes/" + Themes.darkblue.ToString() + "/style.css";
                break;
            case Themes.darkorange:
                path = "../../Content/themes/" + Themes.darkorange.ToString() + "/style.css";
                break;
            case Themes.defaultTheme:
                path = "../../Content/themes/" + Themes.defaultTheme.ToString() + "/style.css";
                break;
            case Themes.green:
                path = "../../Content/themes/" + Themes.green.ToString() + "/style.css";
                break;
            case Themes.greyblue:
                path = "../../Content/themes/" + Themes.greyblue.ToString() + "/style.css";
                break;
            case Themes.lightblue:
                path = "../../Content/themes/" + Themes.lightblue.ToString() + "/style.css";
                break;
            case Themes.lightorange:
                path = "../../Content/themes/" + Themes.lightorange.ToString() + "/style.css";
                break;
            case Themes.pink:
                path = "../../Content/themes/" + Themes.pink.ToString() + "/style.css";
                break;
            case Themes.red:
                path = "../../Content/themes/" + Themes.red.ToString() + "/style.css";
                break;
            case Themes.yellow:
                path = "../../Content/themes/" + Themes.yellow.ToString() + "/style.css";
                break;
            default:
                path = "../../Content/themes/" + Themes.defaultTheme.ToString() + "/style.css";
                break;
        }
        linkBuilder.MergeAttribute("href", "@Url.Content(" + path + ")");
        linkBuilder.MergeAttribute("rel", "stylesheet");
        linkBuilder.MergeAttribute("type", "text/css");

        //génrer le tag <a>
        var builder = new TagBuilder("a");

        //ajouter les différents attributs du tag
        builder.MergeAttribute("href", url.Action(action, controller));
        builder.MergeAttribute("alt", "edit");
        builder.MergeAttribute("title", "Edit");



        if (state)
        {
            builder.AddCssClass("edit_active");
        }

        else
        {
            builder.AddCssClass("edit_inactive");
        }

        string anchorHtml = builder.ToString(TagRenderMode.Normal);

        return MvcHtmlString.Create(anchorHtml);
    }

Я хочу выбрать файл CSS для каждой темы.Это правильный способ сделать это?

1 Ответ

1 голос
/ 06 марта 2012

Это правильный способ сделать это?

номер

Есть много проблем с вашим кодом, я не знаю с чего начать. Вы можете перейти непосредственно к концу моего ответа, где я представлю возможное улучшение вашего помощника, если вас не волнуют мои нападки, которые вот-вот последуют.

Вы никогда не должны жестко кодировать 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)
...
...