我正在尝试调用我在控制器上完成的方法。但是我不知道为什么它一直给我错误,甚至没有输入控制器方法。
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>
}
答案 0 :(得分:0)
您的代码应为
<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>
答案 1 :(得分:0)
您的代码中有多处错误
@Url.Action()
,
不是<%= Url.Action() %>
PublicModulesController
,而不是。{
PublicModulesControllerController
,所以它需要
@Url.Action("retrieveBySelected", "PublicModules")
int
contentType
选项(因此它使用默认的'application/x-www-form-urlencoded; charset=UTF-8'
)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");
}
});
}
根据控制器中的代码,您不清楚尝试返回的内容。您的循环只会覆盖先前迭代中分配的exerciseVideo
的任何现有值。但是如果你希望只有一个匹配,那么你应该只得到那个项目并避免当前代码的所有不必要的开销。我最好的猜测是你想要返回第一个ExerciseVideo
,其中TypeID和RegionID与你在dropownlists中选择的值匹配,在这种情况下它是
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
对象。您要返回的是一个匿名对象,其中仅包含视图中所需的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 join语句可能更容易