在_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视图中获取当前视图名称?
答案 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>
}