首先让我解释一下我要做什么。我有一个下拉菜单,其中值的更改会触发标签文本更改。为此,我附加了一个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
答案 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
的默认路由定义
答案 1 :(得分:1)
您正在使用GET,因此您需要将route属性更改为->
[HttpGet]
[Route("RunDown/GetLabel/{id}")]
public string GetLabel(int id)
{
return "x";
}
您需要在操作方法上方编写此代码。 希望这会有所帮助