首页 > 解决方案 > 仍然有 ddl 重定向问题

问题描述

我仍然有问题。我认为我想做的很简单。我有一个 viewbag 下拉列表 - 工作正常。我只想重定向选择它重定向就像:@Html.ActionLink("Branch", "Employees", new { Branch = item.Branch }) | (但从下拉列表中选择)这应该很难吗?

@Html.DropDownList("Branches", ViewBag.Branches as SelectList, "Select a Branch", new { @id = "ddlBranch" })

<script>
    $(function () {

        $("#ddlBranch").on("change", function () {
            var deptId = $(this).val();
            var routeVal = { Id: deptId };
            var url = '@Url.Action("Department", "Home")';

            $.ajax({
                url: url,
                type: 'POST',
                data: routeVal
            }).done(function (result) {
                window.location.href = result.newUrl;
            })
        })

    })
</script>

标签: asp.net-mvc

解决方案


根据对上述问题的评论:

所以现在我只需要重定向到:@Html.ActionLink("Branch", "Employees", new { Branch = item.Branch })Item.Branch会是$(this).val(). 这可以做到吗?

可能有更优雅的方法,但我一直采用的方法是这样的:

let url = '@Html.ActionLink("Branch", "Employees", new { Branch = "REPLACEME" })';
url = url.replace('REPLACEME', $(this).val());
window.location.href = url;

在客户端,这变成了类似的东西:

let url = '/Brand/Employees?Branch=REPLACEME';
url = url.replace('REPLACEME', encodeURIComponent($(this).val()));
window.location.href = url;

我敢肯定,任何只检查客户端代码的人都会觉得这很愚蠢。但是由于Branch参数可能在查询字符串中,也可能在路由中,并且由于管理它是 ASP.NET MVC 框架的责任,因此生成 URL 和将客户端值放入URL 是两个单独的职责。

因此,我们使用服务器端代码生成带有占位符的 URL(可以是任何字符串,"REPLACEME"是任意选择),然后使用客户端代码将占位符动态替换为所需的值。

这基本上取代了您在原始问题中尝试使用 AJAX 执行的任何操作。除非您需要调用服务器端操作以获取客户端代码不知道的结果以构建 URL,否则您可以完全省略 AJAX 并直接构建 URL。


推荐阅读