【问题标题】:How to define name of an MVC action and call it如何定义 MVC 动作的名称并调用它
【发布时间】:2015-06-01 19:16:19
【问题描述】:

我有一个将当前控制器设置为活动导航栏项目的 Helper 类。它还考虑了下拉导航。

public static MvcHtmlString MenuItem(
this HtmlHelper htmlHelper,
string text,
string action,
string controller,
Dictionary<string, string> dropdown
)
{
    var li = new TagBuilder("li");
    var dropdownList = new TagBuilder("ul");
    var routeData = htmlHelper.ViewContext.RouteData;
    var currentAction = routeData.GetRequiredString("action");
    var currentController = routeData.GetRequiredString("controller");
    if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) &&
        string.Equals(currentController, controller, StringComparison.OrdinalIgnoreCase))
    {
        li.AddCssClass("active");
    }
    li.AddCssClass("menuitem");

    if(dropdown != null)
    {
        li.AddCssClass("dropdown");
        foreach (var item in dropdown)
        {
            var dropdownli = new TagBuilder("li");
            dropdownli.InnerHtml = htmlHelper.ActionLink(item.Key, item.Key, item.Value, null, null).ToHtmlString();
            dropdownList.InnerHtml += dropdownli;
        }
        dropdownList.AddCssClass("dropdown-menu");
        li.InnerHtml = htmlHelper.ActionLink(text, action, controller, null, new { @class="dropdown-toggle", data_toggle="dropdown"}).ToHtmlString() + dropdownList.ToString();
    }
    else
    {
        li.InnerHtml = htmlHelper.ActionLink(text, action, controller).ToHtmlString();
    }

    return MvcHtmlString.Create(li.ToString());
}

Helper 类在 _Layout.cshtml 中调用如下:

@Html.MenuItem("Home", "Index", "Home", null)
@Html.MenuItem("News", "Index", "News", null)
@Html.MenuItem("Media", "Index", "Media",
         new Dictionary<string, string>() {{ "Photos", "Media" }, 
                                           { "Videos", "Media" }})
@Html.MenuItem("Events", "Index", "Events", 
    new Dictionary<string, string>() {{ "FirstEvent", "Events" }, 
                                      { "SecondEvent", "Events" }})
@Html.MenuItem("Donate", "Index", "Donate", 
    new Dictionary<string, string>() {{ "Sponsor", "Donate" }})

问题是对于每个导航栏项目,每个链接的名称都是动作的名称,这意味着如果动作是“FirstEvent”,它将显示为“FirstEvent”而不是“First Event”。

我是否可以做类似 [ActionName("First Event")] 的操作来设置名称,然后在 Helper 类中调用它?

[ActionName("Culture Show")]
    public ActionResult CultureShow()
    {
        return View();
    }

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    您可以使用反射从操作方法中扫描ActionName 属性,但似乎更简单的解决方案是使用模型而不是字典。

    public class HyperlinkDataModel
    {
        public string LinkText { get; set; }
        public string ActionName { get; set; }
        public string ControllerName { get; set; }
    }
    
    @Html.MenuItem("Events", "Index", "Events", 
        new[] {
            new HyperlinkDataModel {
                ActionName = "FirstEvent", ControllerName = "Events", LinkText = "First Event" 
            }, 
            new HyperlinkDataModel {
                ActionName = "SecondEvent", ControllerName = "Events", LinkText = "Second Event"
            }
        })
    

    然后在 HtmlHelper 中执行此操作:

    public static MvcHtmlString MenuItem(
    this HtmlHelper htmlHelper,
    string text,
    string action,
    string controller,
    IList<HyperlinkDataModel> dropdown
    )
    {
        ...
        foreach (var item in dropdown)
        {
            var dropdownli = new TagBuilder("li");
            dropdownli.InnerHtml = htmlHelper.ActionLink(item.LinkText, item.ActionName,
                item.ControllerName, null, null).ToHtmlString();
            dropdownList.InnerHtml += dropdownli;
        }
    

    【讨论】:

    • 上周当我试图解决它时,我曾想过这样做,但由于某种原因,我懒得开一个类来处理它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多