为什么我的动作不返回视图?

时间:2013-08-07 08:59:21

标签: c# jquery asp.net-mvc-4 razor

我有这个页面,我从下拉列表中选择一个项目,ajax调用将所选参数传递给我的控制器中的新动作,如下所示:

function select(e) {
    var unit = $("#unitList").data("kendoDropDownList").value();
    var url = '@Url.Content("~/Reports/UnitRunReport/")';

    $.ajax({
        url: url,
        data: { selectedUnit: unit },
        type: 'GET',
        dataType: 'json',
        success: function (data) {
            //
        },
        error: function () {
            // 
        }
    });
}

这是我的控制器:

public class ReportsController : BaseController
{
    public ReportsViewModel Model { get; set; }
    //
    // GET: /Reports/

    public ActionResult Index()
    {
        Model = new ReportsViewModel
                    {
                        Units = UnitClient.GetListOfUnits(true, "")
                    };

        return View(Model);
    }

    [HttpGet]
    public ActionResult UnitRunReport(string selectedUnit)
    {
        var unit = Convert.ToInt32(selectedUnit);
        Model = new ReportsViewModel
                    {
                        UnitRuns = RunClient.GetRunListForUnit(unit)
                    };

        return View(Model);
    }
}

我必须为两个动作(Index和UnitRunReport)分开视图。调试时,它会将正确的参数传递给UnitRunReport操作,并在return View(Model)语句中移动。有人可以解释为什么我没有从索引页面重定向到新的UnitRunReport视图吗?

5 个答案:

答案 0 :(得分:2)

你正在进行ajax通话。 ajax调用不会重定向页面。

改为重定向到get方法:

window.location = "@Url.Content("~/Reports/UnitRunReport")?selectedunit=" + $("#unitList").data("kendoDropDownList").value();

答案 1 :(得分:1)

您没有被重定向,因为您正在使用ajax进行呼叫。根据定义,这意味着页面不会改变。 ajax调用的结果(在本例中是UnitRunReport方法返回的ActionResult)将返回到您为jQuery提供的成功委托的data参数中。

您可以通过传入成功委托来交换页面上的html(或在页面上的元素中调用结果)来解决这个问题。如果你有一个带有id dataElement的元素,那么在成功回调中使用它

success: function (data) {
        $("#dataElement").html(data);
    }

请注意,您将从控制器方法返回html。您可能希望返回一个json模型,并使用像knockout这样的库将其绑定到您的页面。

如果您想实际重定向到页面而不是像当前那样进行ajax调用,那么当用户更改下拉列表中的选择时,您需要设置window.location属性。这将导致整个页面重新加载并呈现UnitRunReport返回到新页面的视图。

答案 2 :(得分:1)

首先,您正在制作ajax请求,该请求不会重定向页面,只是从操作中读取数据。

其次,您正在请求json结果,它将为您提供json数据。

答案 3 :(得分:1)

看起来你正在尝试获取JSON数据而不是视图,这通常是HTML。因此,您的控制器应如下所示。

public class HomeController : Controller
{
    public ReportsViewModel Model { get; set; }
    //
    // GET: /Reports/

    public ActionResult Index()
    {
        Model = new ReportsViewModel
        {
            Units = UnitClient.GetListOfUnits(true, "")
        };

        return View(Model);
    }

    [HttpGet]
    public ActionResult UnitRunReport(string selectedUnit)
    {
        var unit = Convert.ToInt32(selectedUnit);
        Model = new ReportsViewModel
        {
            UnitRuns = RunClient.GetRunListForUnit(unit)
        };

        return this.Json(Model, JsonRequestBehavior.AllowGet);
    }
}

您可以通过执行console.log来测试javascript中返回的数据。另外,不要使用Url.Content尝试Url.Action,因为您的路线可能无法正确设置,而url.action将确保生成正确的路线。

function select(e) {
    var unit = $("#unitList").data("kendoDropDownList").value();
    var url = '@Url.Action("UnitRunReport", new { controller = "Home" })';
    $.ajax({
        url: url,
        data: { selectedUnit: unit },
        type: 'GET',
        dataType: 'json',
        success: function (data) {
            console.log(data);
            // do something with the data coming back
        },
        error: function () {
            // show some sort of message
        }
    });
}

要查看控制台,只需按F12即可在您喜欢的浏览器中弹出工具(我仍然是一个萤火虫粉丝)。只需要小心将console.log部署到生产环境中,这些日子通常并不重要,因为人们拥有较新的浏览器,但你仍然可能会遇到一两个会漏掉并出现问题的浏览器。如果您想将代码保留在那里并将其投入生产,您可以启动一个脚本,将您的页面投入生产以覆盖console.log

<script type="text/javascript">
    console = {
        log: function (s) {
            // empty method to override console
        }
    };
</script>

将它放在您的site.master中并在开发过程中将其删除,您可以保留所有的console.logs,并且在投入生产时它们将停止显示。

答案 4 :(得分:0)

因为你正在对action方法进行Ajax调用,所以视图将在data参数中返回:function (data)

它不会重定向浏览器。