Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的操作不返回视图?_C#_Jquery_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 为什么我的操作不返回视图?

C# 为什么我的操作不返回视图?,c#,jquery,asp.net-mvc-4,razor,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: { sel

我有一个页面,在这里我从下拉列表中选择一个项目,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操作,并遍历
返回视图(模型)
语句。有人能解释一下为什么我没有从索引页面重定向到新的UnitRunReport视图吗

因为您正在对action方法进行Ajax调用,因此视图将在这里的数据参数中返回:
function(data)


它不会重定向浏览器。

因为您正在对action方法进行Ajax调用,因此视图将在此处的数据参数中返回:
function(data)


它不会重定向浏览器。

您正在进行ajax调用。ajax调用不会重定向页面

改为重定向到get方法:

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

您正在进行ajax调用。ajax调用不会重定向页面

改为重定向到get方法:

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

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

您可以通过传递一个成功委托来交换页面上的html(或页面上具有调用结果的元素中的html)来解决此问题,例如,如果您有一个id为dataElement的元素,则在成功回调中使用它

success: function (data) {
        $("#dataElement").html(data);
    }
注意,您正在从控制器方法返回html。您可能希望返回一个json模型,并使用类似于knockout的库将其绑定到页面


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

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

您可以通过传递一个成功委托来交换页面上的html(或页面上具有调用结果的元素中的html)来解决此问题,例如,如果您有一个id为dataElement的元素,则在成功回调中使用它

success: function (data) {
        $("#dataElement").html(data);
    }
注意,您正在从控制器方法返回html。您可能希望返回一个json模型,并使用类似于knockout的库将其绑定到页面


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

首先,您正在发出一个ajax请求,它不会重定向页面,而只是从操作中读取数据


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

首先,您正在发出一个ajax请求,该请求不会重定向页面,而只是从操作中读取数据


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

看起来您是在试图取回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即可在您最喜爱的浏览器中弹出您的工具(我仍然是firebug的粉丝)。在将任何带有console.log的东西部署到生产环境中时都要小心,现在这通常并不重要,因为人们都有更新的浏览器,但您可能仍然会遇到一两个会出现问题的浏览器。如果您想将代码保存在其中并将其投入生产,您可以在页面投入生产时启动脚本以覆盖console.log

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

控制台={
日志:函数{
//重写控制台的空方法
}
};

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

看起来您试图取回的是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即可在您最喜爱的浏览器中弹出您的工具(我仍然是firebug的粉丝)。在将任何带有console.log的东西部署到生产环境中时都要小心,现在这通常并不重要,因为人们都有更新的浏览器,但您可能仍然会遇到一两个会出现问题的浏览器。如果您想将代码保存在其中并将其投入生产,您可以在页面投入生产时启动脚本以覆盖console.log

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

控制台={
日志:函数{
//重写控制台的空方法
}
};
将它放在site.master中,并在开发期间将其删除,您可以保留所有的console.log