如何将变量传递给ASP.NET Core的Tag Helpers属性?

时间:2018-09-20 16:17:21

标签: asp.net-core asp.net-core-mvc asp.net-core-2.0 tag-helpers asp.net-core-tag-helpers

我需要为表单动态生成路由名称,并将其传递给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 :(得分:1)

显然<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. Startup.Configure 方法中定义名为 MyRouteName 的路由:

    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,并验证生成的HTML表单的 action 属性是否正确。 (在ASP.NET Core 2.0和2.1上进行了测试。)

问题很可能出在您的路由配置中:当您在 asp-route 属性中传递未定义的路由名称时,会生成一个空的 action 属性。 / p>