如何强制 TagHelpers 和 HtmlHelpers 在 ASP.NET 5 BETA 8 中使用明确的 Controller 和 ActionMethod 值
How can one force TagHelpers and HtmlHelpers to use explicit Controller and ActionMethod values in ASP.NET 5 BETA 8
似乎在 ASP.NET 5.
中的 TagHelpers 和 HTMLHelpers 中内置了某种控制器验证
但是,它不会在构建项目时给出编译错误或警告,而是将控制器和方法名称呈现为空字符串。
模拟:
我在我的项目中创建了一个名为 MyCustomController 的控制器
我有默认的家庭控制器,但我的任何控制器中都没有 Dog ActionMethod
<a asp-controller="Home" asp-action="Dog" asp-route-id="1">Dog</a>
渲染到
<a href="">Dog</a>
我更喜欢 URL 显式呈现而不是 /Home/Dog/
再举个例子:(我特意在Create中加了一个route id)
<a asp-controller="MyCustom" asp-action="Create" asp-route-id="1">Month Create</a>
<a asp-controller="MyCustom" asp-action="Edit" asp-route-id="1">Month Edit</a>
<a asp-controller="MyCustom" asp-action="Delete" asp-route-id="1">Month Delete</a>
MyCustomController 方法:
[HttpGet]
public IActionResult Create()
[HttpGet]
public async Task<IActionResult> Edit(int id)
[HttpGet("{id:int}")]
public async Task<IActionResult> Delete(int id)
渲染到:
<a href="/MyCustom/Create/1">Create</a>
<a href="/1">Edit</a>
<a href="/1">Delete</a>
我看不出为什么 TagHelpers 没有在 url 中为编辑和删除呈现控制器和操作方法名称。
我也测试了 HTML ActionLink Helpers 并且输出与 TagHelpers 相同
@Html.ActionLink("Create", "Create", new { id = item.Id })
@Html.ActionLink("Edit", "Edit", new { id = item.Id })
@Html.ActionLink("Delete", "Delete", new { id = item.Id })
渲染到:
<a href="/MyCustom/Create/1">Create</a>
<a href="/1">Edit</a>
<a href="/1">Delete</a>
然后我花了相当多的时间来调试,因为没有迹象表明问题出在哪里。
我通过以下方式修复了它:
- 删除编辑、删除操作方法的 [HttpGet] 属性。
- 正在将 Post 编辑操作方法的 [HttpPost("{id:int}")] 更改为 [HttpPost]。
我的问题:
有没有办法将 TagHelpers 和 HtmlHelpers 设置为显式呈现而不对控制器进行验证?
您可以在 mvc repro 中创建关于此的问题。
如果您不喜欢默认行为,您可以更改默认行为或用您自己的标签助手替换默认行为。例如参见 [=11=]
我将 this question 作为 ASP.NET MV GitHub 回购问题发布
这是我从Ryan Nowak
收到的回复
这是对路由行为的更改。您可以像这样恢复到旧行为:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
namespace BestEffortLinkGenerationWebSite
{
public class Startup
{
// Set up application services
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<RouteOptions>((options) =>
{
options.UseBestEffortLinkGeneration = true;
});
}
public void Configure(IApplicationBuilder app)
{
app.UseCultureReplacer();
app.UseMvcWithDefaultRoute();
}
}
}
似乎在 ASP.NET 5.
中的 TagHelpers 和 HTMLHelpers 中内置了某种控制器验证
但是,它不会在构建项目时给出编译错误或警告,而是将控制器和方法名称呈现为空字符串。
模拟:
我在我的项目中创建了一个名为 MyCustomController 的控制器
我有默认的家庭控制器,但我的任何控制器中都没有 Dog ActionMethod
<a asp-controller="Home" asp-action="Dog" asp-route-id="1">Dog</a>
渲染到
<a href="">Dog</a>
我更喜欢 URL 显式呈现而不是 /Home/Dog/
再举个例子:(我特意在Create中加了一个route id)
<a asp-controller="MyCustom" asp-action="Create" asp-route-id="1">Month Create</a>
<a asp-controller="MyCustom" asp-action="Edit" asp-route-id="1">Month Edit</a>
<a asp-controller="MyCustom" asp-action="Delete" asp-route-id="1">Month Delete</a>
MyCustomController 方法:
[HttpGet]
public IActionResult Create()
[HttpGet]
public async Task<IActionResult> Edit(int id)
[HttpGet("{id:int}")]
public async Task<IActionResult> Delete(int id)
渲染到:
<a href="/MyCustom/Create/1">Create</a>
<a href="/1">Edit</a>
<a href="/1">Delete</a>
我看不出为什么 TagHelpers 没有在 url 中为编辑和删除呈现控制器和操作方法名称。
我也测试了 HTML ActionLink Helpers 并且输出与 TagHelpers 相同
@Html.ActionLink("Create", "Create", new { id = item.Id })
@Html.ActionLink("Edit", "Edit", new { id = item.Id })
@Html.ActionLink("Delete", "Delete", new { id = item.Id })
渲染到:
<a href="/MyCustom/Create/1">Create</a>
<a href="/1">Edit</a>
<a href="/1">Delete</a>
然后我花了相当多的时间来调试,因为没有迹象表明问题出在哪里。 我通过以下方式修复了它:
- 删除编辑、删除操作方法的 [HttpGet] 属性。
- 正在将 Post 编辑操作方法的 [HttpPost("{id:int}")] 更改为 [HttpPost]。
我的问题: 有没有办法将 TagHelpers 和 HtmlHelpers 设置为显式呈现而不对控制器进行验证?
您可以在 mvc repro 中创建关于此的问题。
如果您不喜欢默认行为,您可以更改默认行为或用您自己的标签助手替换默认行为。例如参见 [=11=]
我将 this question 作为 ASP.NET MV GitHub 回购问题发布
这是我从Ryan Nowak
收到的回复这是对路由行为的更改。您可以像这样恢复到旧行为:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
namespace BestEffortLinkGenerationWebSite
{
public class Startup
{
// Set up application services
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<RouteOptions>((options) =>
{
options.UseBestEffortLinkGeneration = true;
});
}
public void Configure(IApplicationBuilder app)
{
app.UseCultureReplacer();
app.UseMvcWithDefaultRoute();
}
}
}