【问题标题】:How to call method in controller from view via ajax?如何通过ajax从视图中调用控制器中的方法?
【发布时间】:2016-05-27 06:12:05
【问题描述】:

我创建了一个调查。对于整个调查,我只有视图和每个问题的部分视图。我也有分页。所有这些都显示在下图中。
现在人们可以使用GetAnswersMulti 方法将表单(整个问题)发布到服务器。 (我需要异步发布表单)。我想添加一个功能 - 当人们看到最后一个未回答的问题时 - 按钮从 Answer 变为 Answer and exit。我想通过删除一个按钮并添加另一个带有特定 URL 的按钮来做到这一点。问题是 - 服务器应该检查这个问题是否是最后一个问题。 我尝试异步调用控制器中的相应方法并获取返回值。 我从 SO 中尝试了很多,这就是我的结论:
查看

<script>
    function isLast(data) {
        $.ajax({
            type: "POST",
            url: "@Url.Action("Survey", "IsLastQuestion")",
            data: { idQuestion: data },
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                alert("success");
                if (msg == "True") {
                    $(".submitbutton").remove();
                }
            },
            error: function (e) {
                alert("Fail");
            }
        });
    }
</script>

@using (Html.BeginForm("GetAnswersMulti", "Survey", FormMethod.Post))
{
    <input value="Ответить" type="submit"
           class="btn btn-default submitbutton"
           onclick="isLast(@Model.FirstOrDefault().IdQuestion);" />
}

控制器

[HttpPost]
public ActionResult IsLastQuestion(int idQuestion)
{
    Question question = Manager.GetQuestion(idQuestion);
    List<Question> questions = Manager.SelectQuestions(question.idAnketa);
    if (questions.Count == Manager.GetCountQuestionsAnswered(question.idAnketa, SessionUser.PersonID))
        return new JsonResult() { Data = true };
    else
        return new JsonResult() { Data = false };
}
[HttpPost]
public void GetAnswersMulti(List<PossibleAnswerVM> possibleAnswers)
{
    List<Answer> answers = new List<Answer>();
    foreach (PossibleAnswerVM possibleAnswer in possibleAnswers)
    {
        Answer answer = new Answer();
        answer.datetimeAnswer = DateTime.Now;
        answer.idOption = possibleAnswer.IdOption;
        answer.idPerson = SessionUser.PersonID;
        if (possibleAnswer.IsChecked)
        {
            if (IsValid(answer))
                answers.Add(answer);
        }
    }
        Manager.SaveAnswers(answers,possibleAnswers.FirstOrDefault().IdQuestion, SessionUser.PersonID);
}

现在调用控制器中的方法并传递 idQuestion。控制器中的方法返回 true(当它是最后一个问题时)。然后我在js代码中失败了。 请帮帮我。我通过 SO 搜索了 2 天,但没有找到任何适合我的东西。

【问题讨论】:

  • 你想做什么?你为什么将Ajax.BeginForm() 和 jquery ajax 结合起来?你$.ajax 调用IsLastQuestionController 中的Survey 方法(你有错误的参数),它甚至没有传递idQuestion 的值你在SurveyController 中的GetAnswersMulti() 方法是什么?
  • @StephenMuecke 抱歉,我编辑了答案,现在将参数传递给函数。我试图在控制器方法(由提交调用)中做所有事情,但也无法应对。我问了here 的问题,人们建议我按照我的理解遵循这种方法。
  • 你没有通过任何东西 - 你所拥有的只是data: "{}", 我从来没有见过你链接的那个问题,更不用说给你任何建议了。无法理解您在这里尝试做什么。 (而您现在编辑调用了一个甚至不存在的isLast2() 函数)
  • @StephenMuecke 他们通过发送指向另一个问题的链接来提供建议。我需要通过 ajax 发布表单,同时检查这个问题是否是最后一个问题。如果是这样 - 删除按钮。
  • @VitaliiIsaenko,您没有在问题中解释任何内容。很抱歉,您的问题中的几乎每一行代码都有错误,没有任何可能工作。如果你没有清楚地解释这个观点是为了什么,你想要达到什么目的,那么没有人能给你正确的答案。

标签: c# jquery ajax asp.net-mvc controller


【解决方案1】:

最好使用 Html.Beginform() 并使用此脚本:

       <script>
            function isLast(data) {

                $.ajax({
                    type: "POST",
                    url: "@Url.Action("Survey", "IsLastQuestion")",
                    data: { idQuestion : data},
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg){
                        alert($.parseJSON(msg.d));
                        if (msg == "True") {
                           $(".submitbutton").remove();
                }
                    },
                    error: function (e) {
                        alert("Fail");
                    }
                });

            }
        </script>

@using (Html.BeginForm("GetAnswersMulti", "Survey", FormMethod.Post)
<input type="text" id="commentText" placeholder="Введите коментарий"/>
        <input value="Ответить" type="submit"
               class="btn btn-default submitbutton"
               onclick="isLast(@Model.FirstOrDefault().IdQuestion);" />
    }

【讨论】:

  • @Vitalii Isaenko ,您没有将任何值传递给您的操作,
  • @Vitalii Isaenko ,还要记住 asp.net 将布尔值返回为字符串“True”
  • 抱歉让您感到困惑 - 我使用 if (msg.d == "True") 并且仅使用 isLast() 函数。我试过了,但又失败了。
【解决方案2】:

为了让你的动作返回 Json,那么动作的返回类型需要是 Json。由于该操作返回一个布尔值(真或假),因此它不被视为操作方法。它需要像这样返回一个ActionResult 类型

public ActionResult IsLastQuestion(int idQuestion)
 {
Question question = Manager.GetQuestion(idQuestion);
List<Question> questions = Manager.SelectQuestions(question.idSurvey);
if (questions.Count == Manager.GetCountQuestionsAnswered(
    question.idSurvey,SessionUser.PersonID))
    return Json(new{ d = true});
else
    return Json(new{ d = false});
}

请注意,当我像 return Json(new{ d = true}); 这样返回 Json 时,会有一个匿名变量 d,这是您将在 success 函数中检查的布尔值,如下所示

success: function (msg){
                    alert($.parseJSON(msg.d));
                    if (msg.d === true) {
                       $(".submitbutton").remove();
            }
                    else if(msg.d == false){
      // Do something if false retured.
     }
    }

【讨论】:

  • 我试过了 - 请查看更新后的问题。不幸的是我失败了。
  • 你有没有在action方法上设置一个断点,看看它是否被命中?
  • 由于您要向控制器发送一个 post ajax 调用,因此您需要在操作顶部添加 [HttpPost] 属性。
【解决方案3】:

你可以这样试试吗?

[HttpGet]
public ActionResult IsLastQuestion(int idQuestion)
{
    Question question = Manager.GetQuestion(idQuestion);
    List<Question> questions = Manager.SelectQuestions(question.idSurvey);
    if (questions.Count == Manager.GetCountQuestionsAnswered(question.idSurvey, SessionUser.PersonID))
        return Content("True", "application/json" );
    else
        return Content("False", "application/json" );
}

在你的 ajax 调用中-

    function isLast(data) {
    $.ajax({
        type: "GET",
        url: "@Url.Action("Survey", "IsLastQuestion")",
        data: { idQuestion: data },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result)
        {
            //check the value inside result here..
        },
        error: function (e) {
            alert("Fail");
        }
    });
}

【讨论】:

  • 你的意思是bool方法类型?我试过了,没有帮助。还有[HttpPost] 属性。
  • 参数好像有问题。你能检查一下你的 isLast() 函数是否被按钮点击了吗?你可以尝试删除数据属性和方法参数(只尝试调用不带参数的函数)?
  • 参数被传递,函数也调用控制器中的方法,对应的参数值。但是,它可能不能从控制器中的方法或其他方法中获取msg
  • 我再次收到失败警报。
  • 由于您只是通过传递单个参数值来查询您的控制器,因此您可以通过“GET”来完成。我已经编辑了我的答案。请检查Controller Action方法的值是否传递给ajax成功。
【解决方案4】:

IsLastQuestion 函数中需要参数,您不要在脚本中传递它。

function isLast(parameter) {
    $.ajax({
        type: "POST",
        url: "@Url.Action("Survey", "IsLastQuestion")",
        data: "{parameter}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg){
            alert($.parseJSON(msg.d));
        },
        error: function (e) {
            alert("Fail");
        }
    });
    if (isLast2 == true) {
        $(".submitbutton").remove();
    }
}

【讨论】:

  • 你说得对!反正我失败了。
猜你喜欢
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2013-07-02
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多