如何将变量传递给 ASP.NET Core 的 Tag Helpers 属性?
How do you pass variable to ASP.NET Core's Tag Helpers attributes?
我需要为我的表单动态生成路由名称并将其传递给 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>
确实有效。我整理了一个样本来证明这一点:
创建一个空的 ASP.NET 核心 MVC 应用程序:
dotnet new mvc
添加控制器进行测试(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)}");
}
}
添加相关视图(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>
在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" });
});
启动应用程序,导航到 /Test/Index
并验证生成的 HTML 表单的 action 属性是否正确。 (在 ASP.NET Core 2.0 和 2.1 上测试。)
问题很可能出在您的路由配置上:当您在 [=67 中传递未定义的路由名称时,会生成一个空的 action 属性=]-路由属性.
我需要为我的表单动态生成路由名称并将其传递给 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>
确实有效。我整理了一个样本来证明这一点:
创建一个空的 ASP.NET 核心 MVC 应用程序:
dotnet new mvc
添加控制器进行测试(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)}"); } }
添加相关视图(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>
在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" }); });
启动应用程序,导航到
/Test/Index
并验证生成的 HTML 表单的 action 属性是否正确。 (在 ASP.NET Core 2.0 和 2.1 上测试。)
问题很可能出在您的路由配置上:当您在 [=67 中传递未定义的路由名称时,会生成一个空的 action 属性=]-路由属性.