无法访问控制器方法

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>

您的代码中有多个错误

  1. 您使用的是 razor 视图引擎,因此需要 @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. 您的 returning 中的 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");
        }
    });
}

根据您控制器中的代码,不清楚您试图 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 的那些属性(你只是将属性 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 连接语句可能更容易