如何在视图中获取当前的动作名称

时间:2019-03-16 23:14:48

标签: c# asp.net-core

在_Layout页面上,我有一个搜索表单,每个控制器都有一个索引视图。当用户单击搜索按钮时,它将在当前索引视图中进行搜索。

如果用户是索引视图,如果他们转到其他视图,我想显示搜索字段,我想隐藏它。

在我的_Layout

 <form asp-action="Index" method="get" class="navbar-form form-inline navbar-right">
        <input class="form-control mr-sm-2" id="search" name="search" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success my-2 my-sm-0"  id="BtnSearch" name="BtnSarch" type="submit">Search</button>
    </form>

我目前正在使用JQuery,但是放置每个视图非常困难

    $("#search").hide();
    $("#BtnSearch").hide();

基本上,在我的_Layout页面中,如果用户位于索引视图中,我想显示或隐藏“搜索”表单。 请问如何在_Layout视图中获取当前视图名称?

4 个答案:

答案 0 :(得分:2)

这听起来像是mvc标签帮助程序的理想选择。

您将需要创建一个继承自TagHelpers的类并覆盖处理方法。

[HtmlTargetElement(“website-search”)]
Public class Search : TagHelper
{
    Public WebsiteContext Info { get; set; }

    Public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        Output.TagName = “section”;
        Output.Content.SetHtmlContent(“ HTML for your search form “);
        Output.TagMode = TagMode.StartTagAndEndTag;
    }
}

为了获得控制器和动作,您需要向标记帮助器添加一个属性:

[HtmlAttributeNotBound]
[ViewContext]
Public ViewContext ViewContext { get; set; }

现在您已经有了视图上下文,可以执行以下操作:

If(ViewContext.RouteData.Values[“action”]) != “Index”)
{
    Output.SuppressOutput();
}

然后您可以通过在您的视图中放置网站帮助程序来引用此内容。

请参见以下链接,以获取标签帮助器https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-2.2的简介

以下堆栈溢出问题详细说明了如何针对Knowing what route the user is on inside TagHelper in .NET Core

执行控制器和操作

希望这会有所帮助

答案 1 :(得分:1)

您可以向布局文件添加隐藏的输入,并为其分配ID。 然后,您可以从任何地方获取操作和控制器名称:

<input type="hidden" value="@this.ViewContext.RouteData.Values["action"].ToString()" />
<input type="hidden" value="@this.ViewContext.RouteData.Values["controller"].ToString()" />

因此,如果您不在JS中使用它们,则可以声明一个变量,并在操作为索引时显示表单。

希望能提供帮助。

答案 2 :(得分:1)

  
    

基本上,在我的_Layout页面中,如果用户位于索引视图中,我想显示或隐藏“搜索”表单。

  

尝试以下代码:

@if ("Index".Equals(ViewContext.RouteData.Values["Action"].ToString()))
{
    <form asp-action="Index" method="get" class="navbar-form form-inline navbar-right">
        <input class="form-control mr-sm-2" id="search" name="search" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success my-2 my-sm-0" id="BtnSearch" name="BtnSarch" type="submit">Search</button>
    </form>
}

答案 3 :(得分:1)

如果只想在特定视图中显示搜索表单,则不会基于视图名称。将来,您可能还需要其他视图。因此,为什么不简单地添加一个标志以在您的ViewBag中显示搜索表单。这将意味着在每个“索引”操作中都设置此标志,但是您将更灵活地显示它。

控制器:

public ActionResult Index()
{
    this.ViewBag.ShowSearch = true;
    // … your normal code
    return this.View();
}

_Layout.cshtml

@if (this.ViewBag.ShowSearch == true) // explicitly check for true, so not having set the flag in the ViewBag will not pose a problem, i.e. null != true.
{
    <form action="">@* … *@</form>
}