代码之家  ›  专栏  ›  技术社区  ›  Ben

如何将变量传递给ASP.NET 核心的标记助手属性?

  •  0
  • Ben  · 技术社区  · 7 年前

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

    有没有办法将变量传递给 属性?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Adam Simon    7 年前

    很明显 <form asp-route="GetRouteName()"></form> 将不起作用,因为它将传递“GetRouteName()”字符串而不是方法调用的结果。

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

    1. 创建一个空的ASP.NET 核心MVC应用程序:

      dotnet new mvc
      
    2. 添加控制器进行测试( ):

      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. 添加相关视图( 视图/测试/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 方法:

      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表单的属性是正确的(测试日期ASP.NET 核心2.0和2.1。)

    问题很可能出在您的路由配置上:空路由 行动 asp路由