无法访问控制器方法

时间:2015-12-13 09:52:16

标签: jquery asp.net asp.net-mvc-5 asp.net-ajax

我正在尝试调用我在控制器上完成的方法。但是我不知道为什么它一直给我错误,甚至没有输入控制器方法。

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>
}

2 个答案:

答案 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)

您的代码中有多处错误

  1. 您使用剃须刀视图引擎,因此需要@Url.Action(), 不是<%= Url.Action() %>
  2. 您的控制器名为PublicModulesController,而不是。{ PublicModulesControllerController,所以它需要 @Url.Action("retrieveBySelected", "PublicModules")
  3. 您发送文本值“exerRegionID”和“exerTypeID”(不是 您的下拉列表的值)到期望的控制器方法 int
  4. 您没有对数据进行字符串化,因此您需要将其删除 contentType选项(因此它使用默认的'application/x-www-form-urlencoded; charset=UTF-8'
  5. 您返回的json不包含名为Result
  6. 的属性

    您的脚本应该是

    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属性(您刚刚向控制器发送了属性ExerciseTypeIDExerciseRegionID,因此无需再发回一次 - 你已经知道他们在视图中是什么了)

    或者,你可能想要的是

    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语句可能更容易