C# 为什么我的操作不返回视图?
我有一个页面,在这里我从下拉列表中选择一个项目,ajax调用将所选参数传递给控制器中的一个新操作,如下所示: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
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