通过URL传入id时的Mvc Route 404

Mvc Route 404 When Passing in id through URL

让我先解释一下我想做什么。我有一个带有下拉列表的表单,其中值的更改会触发标签文本的更改。为此,我附加了一个要触发的 onchange 脚本事件。

 <select onchange="ChangeLabel()" id="ContainerValue" asp-for="Container" class="form-control"/>

标签

<label id="AddressLabel" asp-for="Container" class="control-label"/>

它调用的脚本是

 <script>
    function ChangeLabel() {
        var val = $('#ContainerValue').val();
        $.ajax({
            url: '/Rundown/GetLabel/' + val ,
            type: "GET",
            dataType: "text",
            success: function (labelText) {
                $("#AddressLabel").html(labelText);
            }
        });
    }
</script>

所以我在我的控制器中创建了一个名为 GetLabel 的操作,它带有一个参数 id。

[HttpGet]
// GET: Rundown/GetLabel/5
public string GetLabel(int id)
{
    return "x";
}

所以我很确定我使用的是在项目设置时创建的默认路由。据我所知,我没有搞砸这个。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

现在,当我在下拉列表中更改选择时,更改请求被触发并向 /Rundown/GetLabel/1 发出请求,但它 returns 出现 404 错误。出于测试目的,我注意到如果我执行 /Rundown/GetLabel/?id=1 我会点击我的 GetLabel 操作并取回我的 "x" 字符串值。知道为什么我没有看到我的动作受到正常打击 [controller]/[action]/[id] 路由我希望工作吗?

我能想到的唯一其他相关信息是控制器上方夹具中的路由 class。

[Route("[controller]/[action]")]
public class RundownController : Controller

您正在混合属性路由和基于约定的路由,这导致了冲突。

此处属性路由将优先于基于约定的路由,并且由于您没有找不到操作参数的路由模板。

为操作添加路由模板

Route("[controller]/[action]")]
public class RundownController : Controller {

    // GET: Rundown/GetLabel/5
    [HttpGet("{id}")]        
    public string GetLabel(int id) {
        return "x";
    }

}

控制器上有属性路由,动作上只有 HttpGet 意味着 URL 看起来像

Rundown/GetLabel?id=5

通过包含路由模板参数 [HttpGet("{id}")] 您可以获得所需的行为。

另一种方法是从控制器顶部删除 Route("[controller]/[action]")] 并允许启动时的默认路由定义 MapRoute

引用Routing to controller actions in ASP.NET Core

您正在使用 GET ,因此您需要将路由属性更改为 ->

[HttpGet]
[Route("RunDown/GetLabel/{id}")]
public string GetLabel(int id)
{
  return "x";
}

你需要把这个写在你的动作方法上面。 希望这有帮助

我知道这是一个旧线程,但我认为刚刚经历过类似的问题,值得指出的是你的路由参数必须与你的函数参数匹配,这也可能是你得到 404 的原因。