Как передать переменную атрибутам Tag Helpers в ASP.NET Core? - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно динамически сгенерировать имя маршрута для моей формы и передать его помощнику по тегу form.Вот что у меня есть:

@{ string route = GetRouteName(); // returns "MyRouteName" }

<form asp-route="route"></form>
<p>@route</p>

Это приводит к следующей разметке (обратите внимание, что для действия нет значения):

<form action="" method="post" novalidate="novalidate">
</form>
<p>MyRouteName</p>

Я знаю, что имя маршрута генерируется правильнопотому что он помещается в тег p, и если я просто ввожу его непосредственно в атрибут asp-route, он будет работать, как и ожидалось.

Я пробовал следующие варианты без разницы в результате:

<form asp-route="GetRouteName()"></form>
<form asp-route="@GetRouteName()"></form>
<form asp-route="@route"></form>

Есть ли способ передать переменную в атрибут asp-route?

1 Ответ

0 голосов
/ 20 сентября 2018

Очевидно, что <form asp-route="GetRouteName()"></form> не будет работать, так как здесь передается строка «GetRouteName ()» вместо результата вызова метода.

Однако <form asp-route="@GetRouteName()"></form> или <form asp-route="@route"></form> определенно работает.Я собрал пример, чтобы доказать это:

  1. Создать пустое приложение ASP.NET Core MVC:

    dotnet new mvc
    
  2. Добавитьконтроллер для тестирования ( Controllers / TestController.cs ):

    public class TestController : Controller
    {
        public IActionResult Index()
        {
            if (HttpMethods.IsGet(Request.Method))
                return View();
            else
                return Content($"{Request.Method} {UriHelper.BuildRelative(Request.PathBase, Request.Path, Request.QueryString)}");
        }
    }
    
  3. Добавить связанный вид ( Views / Test / Index.cshtml ):

    @functions { string GetRouteName() => "MyRouteName"; }
    
    @{ string route = GetRouteName(); /* returns "MyRouteName" */ }
    
    <p>Route name: @route</p>
    
    <p>Route: @Url.RouteUrl(route)</p>
    
    <form asp-route="@route">
        <input type="submit" value="Submit" />
    </form>
    
  4. Определить маршрут с именем MyRouteName в методе Startup.Configure :

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "MyRouteName",
            template: "Test/{action}",
            defaults: new { controller = "Test" });
    
        routes.MapRoute(
            name: "AnotherRouteName",
            template: "",
            defaults: new { controller = "Home", action = "Index" });
    });
    
  5. Запустите приложение, перейдите к /Test/Index и убедитесь, что атрибут action сгенерированной HTML-формы верен.(Протестировано на ASP.NET Core 2.0 и 2.1.)

Весьма вероятно, что проблема заключается в конфигурации вашего маршрута: пустой атрибут action генерируется, когда выпередать неопределенное имя маршрута в атрибуте asp-route .

...