Как реализовать «если активно» обнаружение в Html.Helper? - PullRequest
0 голосов
/ 22 сентября 2010

Извинения, я новичок в ASP.NET MVC.:)

Я не уверен, является ли это простым недоразумением или неправильной парадигмой, используемой для такого рода функций, но это то, что я до сих пор придумал ...

Я хочу предоставить общую функциональность, добавив атрибут css (в данном случае «активный») к тегу привязки, когда мы обнаружим, что пользователь находится на той же странице, что и его href.В контексте MVC (и специально для моего приложения) я интерпретирую это как «Когда текущий активный контроллер совпадает с целевым местоположением гиперссылки».

Хорошо!Так.Где я с кодом?

Я реализовал следующее вспомогательное расширение Html, чтобы помочь в создании слегка «подправленных» из стандартных ссылок, которые мне нужны.

public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
 var cssProprties = controller + " active";
 return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}

В настоящее время выМожно видеть, что я применяю два класса CSS.Во-первых, это имя контроллера, это нормально.Позже у меня нет логики, я просто добавляю активный css-класс.Это то, к чему я пытался добавить логику.

Моя теория, все, что мне нужно сделать, это найти нужный объект, чтобы найти контроллер, в котором я сейчас нахожусь, и сопоставить его спараметр «controller», который передается. Если они совпадают, добавьте активный класс.

Итак, в двух вопросах ...

Это правильный / приемлемый способ«мышления» в ASP.NET mvc?

Если да, то какие объекты я могу найти, с того уровня, на котором я нахожусь, чтобы получить доступ к информации для сравнения - что мне нужно?

ОБНОВЛЕНИЕ:

После того, что обычно происходит, когда я пишу вопрос по SO, у меня возникла мозговая волна.Я заметил фрагмент кода в помощнике BeginForm, который привел меня к созданию этого примера:

public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
    var cssProprties = controller;

    // if this controller is the target controller, page is active.
    if (helper.ViewContext.RouteData.Values["controller"].ToString() == controller)
        cssProprties += " active";

    return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}

Так что я думаю, что это отвечает на вопрос "какие объекты я могу копать?"вопрос.Кроме того, поскольку на это непосредственно повлиял источник MVC - предположительно, «это правильный / приемлемый способ« мышления »в ASP.NET mvc?»вопрос тоже?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Это код, на котором я решил остановиться. Это решает проблему, с которой я столкнулся и на которую непосредственно повлиял исходный код asp.net mvc2. Надеюсь, это поможет и другим.

public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
    var cssProprties = controller;

    // if this controller is the target controller, page is active.
    if (helper.ViewContext.RouteData.Values["controller"].ToString() == controller)
        cssProprties += " active";

    return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}
0 голосов
/ 22 сентября 2010

Это похоже на правильный подход, хотя есть несколько вещей, которые вам нужно учитывать, принимая во внимание.

Если ссылка отображается через Html.Action или Html.RenderAction, тогда ViewContext будет ссылаться на контроллер, на котором включено дочернее действие, что может быть, а может и не быть тем, что вы хотите. Если вы хотите, чтобы он ссылался на контроллер главной страницы, вы можете также выполнить рекурсивную проверку ViewContext.ParentActionViewContext (продолжайте вызывать parent до тех пор, пока он не станет нулевым, затем получите контроллер).

Во-вторых, есть области, у которых могут быть контроллеры с одинаковыми именами, если они находятся в разных областях, поэтому я бы порекомендовал второго помощника, который берет строку области и проверяет как эту область, так и контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...