Asp.net core mvc 为什么Url.RouteUrl不为包含CONTAINT的路由生成地址
我的控制器中有一个操作,该操作具有路由约束,以确保传入ID。当此约束位于路由中时,Asp.net core mvc 为什么Url.RouteUrl不为包含CONTAINT的路由生成地址,asp.net-core-mvc,Asp.net Core Mvc,我的控制器中有一个操作,该操作具有路由约束,以确保传入ID。当此约束位于路由中时,@Url.RouteUrl()不会为路由生成Url,如果我删除该约束,则生成的Url不会出现任何问题。这是.NET5中的错误还是我做错了什么 我尝试了以下方法来生成URL: @Url.RouteUrl("AboutVersion") @Url.RouteUrl("AboutVersion", new { id = 1 }) @Url.Action("AboutVersion", "Home") @Url.Actio
@Url.RouteUrl()
不会为路由生成Url,如果我删除该约束,则生成的Url不会出现任何问题。这是.NET5中的错误还是我做错了什么
我尝试了以下方法来生成URL:
@Url.RouteUrl("AboutVersion")
@Url.RouteUrl("AboutVersion", new { id = 1 })
@Url.Action("AboutVersion", "Home")
@Url.Action("AboutVersion")
@Url.Action("AboutVersion", new { id = 1 })
行动:
[Route("About/{Version:int}", Name = "AboutVersion")]
public JsonResult AboutVersion(byte VersionID)
{
var VersionNotes = _DbContext.ReleaseNotes
.Where(rn => rn.ReleaseVersionID == VersionID)
.Select(rn => rn.Note)
.ToList();
return Json(VersionNotes);
}
编辑:
此代码:
<script type="text/javascript">
$(function ()
{
$('#SelectedVersionID').change(function ()
{
var SelectedVersionID = $(this).val();
var ReleaseNotesSection = $('#ReleaseNotes');
$.ajax({
cache: false,
type: "GET",
url: '@Url.Action("AboutVersion", "Home", new { VersionID = 1 })',
data: { 'VersionID': SelectedVersionID },
success: function (data)
{
alert('@Url.Action("AboutVersion", "Home")');
ReleaseNotesSection.html('');
$.each(data, function (note)
{
ReleaseNotesSection.append($('<li></li>').html(note));
});
},
error: function (xhr, ajaxOptions, thrownError)
{
alert('Error');
}
});
});
});
</script>
$(函数()
{
$('#SelectedVersionID')。更改(函数()
{
var SelectedVersionID=$(this.val();
var ReleaseNotesSection=$(“#ReleaseNotes”);
$.ajax({
cache:false,
键入:“获取”,
url:'@url.Action(“AboutVersion”,“Home”,new{VersionID=1}),
数据:{'VersionID':SelectedVersionID},
成功:功能(数据)
{
警报('@Url.Action(“AboutVersion”,“Home”));
ReleaseNotesSection.html(“”);
$。每个(数据、功能(注)
{
ReleaseNotesSection.append($('').html(注意));
});
},
错误:函数(xhr、ajaxOptions、thrownError)
{
警报(“错误”);
}
});
});
});
生成此输出:
<script type="text/javascript">
$(function ()
{
$('#SelectedVersionID').change(function ()
{
var SelectedVersionID = $(this).val();
var ReleaseNotesSection = $('#ReleaseNotes');
$.ajax({
cache: false,
type: "GET",
url: '',
data: { 'VersionID': SelectedVersionID },
success: function (data)
{
alert('');
ReleaseNotesSection.html('');
$.each(data, function (note)
{
ReleaseNotesSection.append($('<li></li>').html(note));
});
},
error: function (xhr, ajaxOptions, thrownError)
{
alert('Error');
}
});
});
});
</script>
$(函数()
{
$('#SelectedVersionID')。更改(函数()
{
var SelectedVersionID=$(this.val();
var ReleaseNotesSection=$(“#ReleaseNotes”);
$.ajax({
cache:false,
键入:“获取”,
url:“”,
数据:{'VersionID':SelectedVersionID},
成功:功能(数据)
{
警报(“”);
ReleaseNotesSection.html(“”);
$。每个(数据、功能(注)
{
ReleaseNotesSection.append($('').html(注意));
});
},
错误:函数(xhr、ajaxOptions、thrownError)
{
警报(“错误”);
}
});
});
});
在属性路由定义中,您说VersoionID
应该是int
类型
因此,这将生成正确的url
var v1= '@Url.Action("AboutVersion", "Home",new { VersionID =2})';
alert(v1);
但这不会
var v2 = '@Url.Action("AboutVersion", "Home")';
alert(v2);
因此,如果您将VersionID
参数类型从Int
更改为Nullable Int
,它将适用于我们上面使用的Url.Action
的两个重载
[Route("About/{VersionID:int?}", Name = "AboutVersion")]
public JsonResult AboutVersion(byte VersionID)
{
// return something
}
您需要确保动作方法参数和属性路由定义中url模式中的参数匹配。(你在问题中发布的代码中没有)
另外,如果您不使用属性路由装饰器,您的代码将对这两种重载都有效。我刚才提到了
@Url.Action(“AboutVersion”,“Home”,new{VersionID=1})
,但这不起作用。您确定吗?我仔细检查了一下,它对我有效。你确定你的参数名没有任何输入错误吗?你在ASP.Net 5上的MVC6中吗?我正在准确地复制和粘贴我的代码,没有看到任何漏打。是的。在MVC6中验证。这就是问题所在。现在@Url.RouteUrl(“AboutVersion”,new{VersionID=1})
和@Url.Action(“AboutVersion”,“Home”,new{VersionID=1})
工作了。