Как получить текущее имя действия в представлении - PullRequest
5 голосов
/ 17 марта 2019

На моей странице _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 ]

2 голосов
/ 18 марта 2019

Звучит так, будто это идеальный кандидат для помощников тегов 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

Существует следующий вопрос о переполнении стека, подробно описывающий, как заставить контроллер и действие выполняться против: Зная, по какому маршруту находится пользователь внутри TagHelper в .NET Core

Надеюсь, это поможет

1 голос
/ 18 марта 2019

По сути, на моей странице _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>
}
1 голос
/ 18 марта 2019

Если вы хотите показывать форму поиска только в определенных представлениях, я бы не основывал это на имени представления. В будущем вам это может понадобиться и в других видах. Итак, почему бы просто не добавить флаг для отображения формы поиска в вашем 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>
}
1 голос
/ 17 марта 2019

Вы можете добавить скрытый ввод в файл макетов и назначить ему идентификатор. Тогда вы можете получить действие и имя контроллера из любого места:

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

Так что, если вы не используете их в JS, вы можете объявить переменную и показать свою форму, когда действие равно Index.

Надеюсь на помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...