通过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
您正在使用 GET ,因此您需要将路由属性更改为 ->
[HttpGet]
[Route("RunDown/GetLabel/{id}")]
public string GetLabel(int id)
{
return "x";
}
你需要把这个写在你的动作方法上面。
希望这有帮助
我知道这是一个旧线程,但我认为刚刚经历过类似的问题,值得指出的是你的路由参数必须与你的函数参数匹配,这也可能是你得到 404 的原因。
让我先解释一下我想做什么。我有一个带有下拉列表的表单,其中值的更改会触发标签文本的更改。为此,我附加了一个要触发的 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
您正在使用 GET ,因此您需要将路由属性更改为 ->
[HttpGet]
[Route("RunDown/GetLabel/{id}")]
public string GetLabel(int id)
{
return "x";
}
你需要把这个写在你的动作方法上面。 希望这有帮助
我知道这是一个旧线程,但我认为刚刚经历过类似的问题,值得指出的是你的路由参数必须与你的函数参数匹配,这也可能是你得到 404 的原因。