通过URL传递ID时的Mvc路线404

时间:2019-01-25 11:50:04

标签: c# asp.net-core asp.net-core-mvc asp.net-core-routing

首先让我解释一下我要做什么。我有一个下拉菜单,其中值的更改会触发标签文本更改。为此,我附加了一个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>

因此,我在带有参数id的名为GetLabel的控制器中创建了一个动作。

[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发出请求,但它返回404错误。仅出于测试目的,我注意到如果执行/Rundown/GetLabel/?id=1,我将执行GetLabel操作,并返回我的"x"字符串值。知道为什么我看不到自己的动作受到正常打击 [controller]/[action]/[id]可以正常使用路由吗?

我能想到的唯一其他相关信息是控制器类上方的固定装置中的路线。

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

2 个答案:

答案 0 :(得分:2)

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

此属性路由将比基于约定的路由优先,并且由于您没有用于action参数的路由模板,因此找不到该路由。

为操作添加路线模板

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

答案 1 :(得分:1)

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

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

您需要在操作方法上方编写此代码。 希望这会有所帮助