如何强制TagHelpers和HtmlHelpers在ASP.NET 5 BETA 8中使用显式的Controller和ActionMethod值

时间:2015-10-22 14:35:01

标签: asp.net-core asp.net-core-mvc

似乎在ASP.NET 5中的TagHelpers和HTMLHelpers中内置了某种控制器验证 但是,不是在构建项目时给出编译错误或警告,而是将控制器和方法名称呈现为空字符串。

模拟:

我在我的项目中创建了一个名为MyCustomController的控制器

我有默认的Home Controller,但我的任何控制器中都没有Dog ActionMethod

<a asp-controller="Home" asp-action="Dog" asp-route-id="1">Dog</a>

渲染

<a href="">Dog</a>

我希望URL显式呈现给/ Home / Dog /

另一个例子:(我故意为创建添加路由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没有在网址中为“编辑”和“删除”呈现“控制器”和“操作方法”名称的原因。

我还测试了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]属性。
  • 将[HttpPost(“{id:int}”)]更改为[HttpPost]以获取Post Edit操作方法。

我的问题: 有没有办法设置TagHelpers和HtmlHelpers显式呈现而不验证控制器?

2 个答案:

答案 0 :(得分:0)

您可以在mvc repro

中创建相关问题

如果您不喜欢默认行为,可以更改默认值或使用自己的标记符替换默认值。例如,请参阅Taghelpers

答案 1 :(得分:0)

我发布了this question作为ASP.NET MV GitHub repos问题

这是我从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();
        }
    }
}