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

6
在我的_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视图中获取当前视图名称?


我想添加一个新的布局,不带搜索功能,并将其分配给索引视图页面。 - Steve Tolba
谢谢大家的帮助,我希望我可以选择多个答案。 - AliAzra
4个回答

3
基本上,在我的_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>
}

2
这听起来像是MVC标签助手的理想候选者。
您需要创建一个继承自TagHelpers的类,并覆盖process方法。
[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();
}

您可以通过在视图中添加 website-helper 来引用它。
请参考以下链接,了解有关标签助手的介绍:https://learn.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
您可以在布局文件中添加一个隐藏的输入框,并为其分配一个ID。 然后您可以从任何地方获取操作和控制器名称:
<input type="hidden" value="@this.ViewContext.RouteData.Values["action"].ToString()" />
<input type="hidden" value="@this.ViewContext.RouteData.Values["controller"].ToString()" />

所以如果你在JS中不使用它们,你可以声明一个变量,并在动作为Index时显示你的表单。

希望能够帮到你。


1
如果你只想在特定的视图中显示搜索表单,那么我不会基于视图名称来进行设置。因为将来你可能还需要在其他视图中使用它。所以,为什么不简单地向你的 ViewBag 添加一个标志来显示搜索表单呢?这意味着需要在每个 "Index" 操作中设置此标志,但你将更加灵活地决定在哪里显示它。
控制器:
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>
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接