【问题标题】:How do you pass variable to ASP.NET Core's Tag Helpers attributes?如何将变量传递给 ASP.NET Core Tag Helpers 属性?
【发布时间】:2019-02-25 00:18:55
【问题描述】:

我需要为我的表单动态生成路由名称并将其传递给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 属性?

【问题讨论】:

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


    【解决方案1】:

    显然&lt;form asp-route="GetRouteName()"&gt;&lt;/form&gt; 不起作用,因为它传递的是“GetRouteName()”字符串而不是方法调用的结果。

    但是,&lt;form asp-route="@GetRouteName()"&gt;&lt;/form&gt;&lt;form asp-route="@route"&gt;&lt;/form&gt; 确实有效。我整理了一个样本来证明这一点:

    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 属性。

    【讨论】:

    • 感谢您的回复,目前无法尝试任何操作,但是当我复制/粘贴&lt;p&gt; 标签中的路线名称时,它工作得很好。我希望它会抛出一个错误,而不是回到没有价值!
    • 你是 100% 正确的亚当,我是愚蠢的!我的路线名称包含斜杠,而生成的路线名称前面有一个不应该存在的斜杠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2020-01-09
    • 2019-06-10
    • 2019-06-05
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多