为什么Url.RouteUrl没有为其中存在约束的路由生成地址

时间:2016-01-20 17:00:07

标签: asp.net-core-mvc

我的控制器中有一个操作,它有一个路由约束以确保传入ID。当此约束在路由中时,@Url.RouteUrl()不会为路由生成URL,如果我删除了约束生成的URL没有问题。这是.Net 5中的错误还是我做错了什么?

我已尝试以下方法生成网址:

@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>

生成此输出:

<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>

1 个答案:

答案 0 :(得分:4)

在属性路线定义中,您说VersoionID应为int类型。

这样就生成了正确的网址。

var v1= '@Url.Action("AboutVersion", "Home",new { VersionID =2})';
alert(v1);

但这不会

var v2 = '@Url.Action("AboutVersion", "Home")';
alert(v2);

因此,如果您将VersionID param类型从Int更改为Nullable Int,那么它将适用于我们上面使用的Url.Action的重载。

[Route("About/{VersionID:int?}", Name = "AboutVersion")]
public JsonResult AboutVersion(byte VersionID)
{
   // return something
}

您需要确保属性路由定义中的url模式中的action方法参数和param应该匹配。 (它不在您在问题中发布的代码中

此外,如果您不使用属性路径修饰符,您的代码将适用于两个重载。