无法访问控制器方法
Unable to access controller method
我正在尝试调用我在控制器上完成的方法。但是我不知道为什么它一直报错,甚至没有进入控制器方法。
public ActionResult retrieveBySelected(int exerciseRegionID, int exerciseTypeID)
{
System.Diagnostics.Debug.WriteLine("enter");
ExerciseVideo exerciseVideo = new ExerciseVideo();
List<Exercise> list = db.Exercises.ToList();
foreach(Exercise e in list)
{
if (e.ExerciseTypeID == exerciseTypeID && e.ExerciseRegionID == exerciseRegionID)
{
exerciseVideo = db.ExerciseVideos.Where(m => m.ExerciseID == e.ExerciseID).SingleOrDefault();
}
}
return Json(exerciseVideo, JsonRequestBehavior.AllowGet);
}
@section Scripts{
@Scripts.Render("~/bundles/jqueryval")
<script language="javascript">
function selectList() {
var exerRegion = document.getElementById("region");
var exerType = document.getElementById("type");
var exerRegionID = exerRegion.options[exerRegion.selectedIndex].value;
var exerTypeID = exerType.options[exerType.selectedIndex].value;
var variable = { exerciseRegionID: "exerRegionID", exerciseTypeID: "exerTypeID" };
$.ajax({
url: '<%= Url.Action("retrieveBySelected", "PublicModulesController") %>',
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: variable,
cache: false,
success: function (data) {
alert(data.Result);
},
error: function (err) {
alert("error");
}
});
}
</script>
}
您的代码应该是
<script language="javascript">
function selectList() {
//simple jquery access
var exerRegionID = $("#region").val();
var exerTypeID = $("#exerRegionID").val();
//change of quotes
//var variable = { exerciseRegionID: "exerRegionID", exerciseTypeID: "exerTypeID" };
var variable = { "exerciseRegionID": exerRegionID, "exerciseTypeID": exerTypeID };
$.ajax({
url: '<%= Url.Action("retrieveBySelected", "PublicModulesController") %>',
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: variable,
cache: false,
success: function (data) {
alert(data.Result);
},
error: function (err) {
alert("error");
}
});
}
</script>
您的代码中有多个错误
- 您使用的是 razor 视图引擎,因此需要
@Url.Action()
,
不是 <%= Url.Action() %>
- 您的控制器名为
PublicModulesController
,不是
PublicModulesControllerController
,所以需要
@Url.Action("retrieveBySelected", "PublicModules")
- 您发送文本值 "exerRegionID" 和 "exerTypeID"(不是
下拉列表的值)到期望的控制器方法
int
- 您没有对数据进行字符串化,因此您需要删除
contentType
选项(所以它使用默认的 'application/x-www-form-urlencoded; charset=UTF-8'
)
- 您的 returning 中的 json 不包含名为
Result
的 属性
你的脚本应该是
function selectList() {
$.ajax({
url: '@Url.Action("retrieveBySelected", "PublicModules")',
type: 'POST',
dataType: 'json',
data: { exerciseRegionID: $("#region").val(), exerciseTypeID: $("#type").val() },
cache: false,
success: function (data) {
alert(data); //
},
error: function (err) {
alert("error");
}
});
}
根据您控制器中的代码,不清楚您试图 return 做什么。您的循环只会不断覆盖先前迭代中分配的 exerciseVideo
的任何现有值。但是,如果您期望只有一个匹配项,那么您应该只获取该项目并避免当前代码的所有不必要的开销。我最好的猜测是您想 return 第一个 ExerciseVideo
其中 TypeID 和 RegionID 与您在下拉列表中选择的值相匹配,在这种情况下它
public ActionResult retrieveBySelected(int exerciseRegionID, int exerciseTypeID)
{
var data = db.ExerciseVideos.Where(x => x.ExerciseTypeID == exerciseTypeID && x.ExerciseRegionID == exerciseRegionID).FirstOrDefault();
return Json(data, JsonRequestBehavior.AllowGet);
}
这实际上是正确的,您不想发送 ExerciseVideo
对象。你想要的 return 是一个匿名对象,只包含你在视图中需要的 ExerciseVideo
的那些属性(你只是将属性 ExerciseTypeID
和 ExerciseRegionID
发送到控制器,所以有无需再次发回 - 您已经知道视图中的内容)
或者,您可能想要的是
var exercise = db.Exercises.Where(x => x.ExerciseTypeID == exerciseTypeID && x.ExerciseRegionID == exerciseRegionID).FirstOrDefault();
var data = db.ExerciseVideos.Where(m => m.ExerciseID == e.ExerciseID).FirstOrDefault();
虽然是这样,但 linq 连接语句可能更容易
我正在尝试调用我在控制器上完成的方法。但是我不知道为什么它一直报错,甚至没有进入控制器方法。
public ActionResult retrieveBySelected(int exerciseRegionID, int exerciseTypeID)
{
System.Diagnostics.Debug.WriteLine("enter");
ExerciseVideo exerciseVideo = new ExerciseVideo();
List<Exercise> list = db.Exercises.ToList();
foreach(Exercise e in list)
{
if (e.ExerciseTypeID == exerciseTypeID && e.ExerciseRegionID == exerciseRegionID)
{
exerciseVideo = db.ExerciseVideos.Where(m => m.ExerciseID == e.ExerciseID).SingleOrDefault();
}
}
return Json(exerciseVideo, JsonRequestBehavior.AllowGet);
}
@section Scripts{
@Scripts.Render("~/bundles/jqueryval")
<script language="javascript">
function selectList() {
var exerRegion = document.getElementById("region");
var exerType = document.getElementById("type");
var exerRegionID = exerRegion.options[exerRegion.selectedIndex].value;
var exerTypeID = exerType.options[exerType.selectedIndex].value;
var variable = { exerciseRegionID: "exerRegionID", exerciseTypeID: "exerTypeID" };
$.ajax({
url: '<%= Url.Action("retrieveBySelected", "PublicModulesController") %>',
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: variable,
cache: false,
success: function (data) {
alert(data.Result);
},
error: function (err) {
alert("error");
}
});
}
</script>
}
您的代码应该是
<script language="javascript">
function selectList() {
//simple jquery access
var exerRegionID = $("#region").val();
var exerTypeID = $("#exerRegionID").val();
//change of quotes
//var variable = { exerciseRegionID: "exerRegionID", exerciseTypeID: "exerTypeID" };
var variable = { "exerciseRegionID": exerRegionID, "exerciseTypeID": exerTypeID };
$.ajax({
url: '<%= Url.Action("retrieveBySelected", "PublicModulesController") %>',
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: variable,
cache: false,
success: function (data) {
alert(data.Result);
},
error: function (err) {
alert("error");
}
});
}
</script>
您的代码中有多个错误
- 您使用的是 razor 视图引擎,因此需要
@Url.Action()
, 不是<%= Url.Action() %>
- 您的控制器名为
PublicModulesController
,不是PublicModulesControllerController
,所以需要@Url.Action("retrieveBySelected", "PublicModules")
- 您发送文本值 "exerRegionID" 和 "exerTypeID"(不是
下拉列表的值)到期望的控制器方法
int
- 您没有对数据进行字符串化,因此您需要删除
contentType
选项(所以它使用默认的'application/x-www-form-urlencoded; charset=UTF-8'
) - 您的 returning 中的 json 不包含名为
Result
的 属性
你的脚本应该是
function selectList() {
$.ajax({
url: '@Url.Action("retrieveBySelected", "PublicModules")',
type: 'POST',
dataType: 'json',
data: { exerciseRegionID: $("#region").val(), exerciseTypeID: $("#type").val() },
cache: false,
success: function (data) {
alert(data); //
},
error: function (err) {
alert("error");
}
});
}
根据您控制器中的代码,不清楚您试图 return 做什么。您的循环只会不断覆盖先前迭代中分配的 exerciseVideo
的任何现有值。但是,如果您期望只有一个匹配项,那么您应该只获取该项目并避免当前代码的所有不必要的开销。我最好的猜测是您想 return 第一个 ExerciseVideo
其中 TypeID 和 RegionID 与您在下拉列表中选择的值相匹配,在这种情况下它
public ActionResult retrieveBySelected(int exerciseRegionID, int exerciseTypeID)
{
var data = db.ExerciseVideos.Where(x => x.ExerciseTypeID == exerciseTypeID && x.ExerciseRegionID == exerciseRegionID).FirstOrDefault();
return Json(data, JsonRequestBehavior.AllowGet);
}
这实际上是正确的,您不想发送 ExerciseVideo
对象。你想要的 return 是一个匿名对象,只包含你在视图中需要的 ExerciseVideo
的那些属性(你只是将属性 ExerciseTypeID
和 ExerciseRegionID
发送到控制器,所以有无需再次发回 - 您已经知道视图中的内容)
或者,您可能想要的是
var exercise = db.Exercises.Where(x => x.ExerciseTypeID == exerciseTypeID && x.ExerciseRegionID == exerciseRegionID).FirstOrDefault();
var data = db.ExerciseVideos.Where(m => m.ExerciseID == e.ExerciseID).FirstOrDefault();
虽然是这样,但 linq 连接语句可能更容易