Рефакторинг этого PartialView (сохранение текущего имени действия в .cshtml) - PullRequest
1 голос
/ 29 мая 2011


У меня есть PartialView, который широко использует ViewContext.Controller.ValueProvider.GetValue("action").RawValue, вот фрагмент:

 <div class="@(ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString() == "AddQuestion" ? "selectedItem" : "unselectedItem")">
              @Html.ActionLink("Add a Question", "AddQuestion", new { topicId = ViewBag.topicId })</div>
 <div class="@(ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString() == "AddSubTopic" ? "selectedItem" : "unselectedItem")">
                @Html.ActionLink("Add (Sub) Topic", "AddSubTopic", new { topicId = ViewBag.topicId })</div>
 <div class="@(ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString() == "AddResource" ? "selectedItem" : "unselectedItem")">
                @Html.ActionLink("Add a Resource", "AddResource", new { topicId = ViewBag.topicId }) </div>  

И так продолжается ...
Могу ли я просто сохранить действиеимя в .cshtml?(сохранение его во ViewBag не кажется мне естественным, поскольку информация доступна в самом .cshtml)

1 Ответ

3 голосов
/ 30 мая 2011
@{ var actionName = ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString(); }

<div class="@(actionName == "AddQuestion" ? "selectedItem" : "unselectedItem")">
@Html.ActionLink("Add a Question", "AddQuestion", new { topicId = ViewBag.topicId })</div>
<div class="@(actionName == "AddSubTopic" ? "selectedItem" : "unselectedItem")">
...

но, вероятно, было бы чище создать HtmlHelper

public static HtmlString CssClassForAction(this HtmlHelper helper, string action) {
  var actionName = helper.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString();
  return new HtmlString(actionName == action ? "selectedItem" : "unselectedItem");
}

и по вашему мнению

<div class="@Html.CssClassForAction("AddQuestion")">
@Html.ActionLink("Add a Question", "AddQuestion", new { topicId = ViewBag.topicId })</div>
<div class="@Html.CssClassForAction("AddSubTopic")">
...
...