Asp.net core mvc 为什么Url.RouteUrl不为包含CONTAINT的路由生成地址

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

我的控制器中有一个操作,该操作具有路由约束,以确保传入ID。当此约束位于路由中时,
@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})
    工作了。