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



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

显然<form asp-route="GetRouteName()"></form>不起作用,因为这会传递"GetRouteName(("字符串而不是方法调用的结果。

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

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

    dotnet new mvc
    
  2. 添加用于测试的控制器(控制器/测试控制器.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 表单的操作属性是否正确。(在 ASP.NET Core 2.0和2.1上测试。

问题很可能出在路由配置上:在asp-route属性中传递未定义的路由名称时,会生成一个空的操作属性。

最新更新