【问题标题】:call an c# mvc controller method from jquery using $.getJson Method使用 $.getJson 方法从 jquery 调用 c# mvc 控制器方法
【发布时间】:2013-12-17 18:10:27
【问题描述】:

我显然错过了一些东西,但我一生都看不到它是什么,如果有人能指出我的错误,我将不胜感激。

我有一个简单的详细信息页面,其中包含一个用于将 cmets 添加到所选详细信息的表单。

我有一个视图,其中包含以下格式:

@using (Html.BeginForm("Details", "Home", FormMethod.Post, new { id ="commentForm" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <div class="form-group">
        @Html.LabelFor(model => model.NewComment.Name);
        @Html.TextBoxFor(model => model.NewComment.Name, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.NewComment.Body);
        @Html.TextAreaFor(model => model.NewComment.Body, new { @class = "form-control" })
    </div>

    <input type="submit" class="btn btn-primary" value="Add Comment" />
} 

此视图然后调用以下 c# 控制器方法:

        [HttpPost]
        public ActionResult Details(int id,DetailsViewModel model)
        {

            if (!ModelState.IsValid)
                return View(model);

            var content =_data.First(c => c.Id == id);

            content.Comments.Add(model.NewComment);

            return View(new DetailsViewModel(content));
        }

如果我使用表单而不添加任何额外的代码来使用 jquery 捕获提交,那么这一切都可以正常工作。

当我将以下 JQuery 代码添加到页面时,上面的服务器代码不会被执行(我知道我实际上并没有在上面的方法中返回任何 json,但是如果没有执行该方法,那现在看起来是多余的吗?):

    $(document).ready(function () {

        $("#commentForm").submit(function (event) {
            event.preventDefault();

            var url = $(this).attr('action');

            $.getJSON(url, $(this).serialize(), function (comment) {
                alert(comment)
            });
        });
    });

如果还值得注意的是,如果我在 getjson 调用周围添加任何警报,那么这些都会正确触发。

有人知道我做错了什么吗?

【问题讨论】:

    标签: c# javascript jquery asp.net-mvc razor


    【解决方案1】:

    当您使用 .getJSON 时,它会发出 GET 请求,而您的 Details 方法仅响应 POST 请求。

    试试这个:

    $.ajax({
      type: "POST",
      url: url,
      data: $(this).serialize(),
      success: function(comment) {
        alert(comment);
      }
    });
    

    【讨论】:

      【解决方案2】:

      尝试发布到控制器。

      $.getJSON 在后台执行 http get。您的控制器端点正在等待一个帖子,并且不会接受 http get。

      这是一个提供相同功能的函数(blog reference):

      (function ($) {
      
          $.postJSON = function (url, data) {
      
              var o = {
                  url: url,
                  type: "POST",
                  dataType: "json",
                  contentType: 'application/json; charset=utf-8'
              };
      
              if (data !== undefined) {
                  o.data = JSON.stringify(data);
              }
      
              return $.ajax(o);
          };
      
      } (jQuery));
      

      只需在你的 jQuery 包含之后的某个地方添加它。

      【讨论】:

        【解决方案3】:

        使用 $.post() 代替,当您使用 FormMethod.Post 时:http://api.jquery.com/jQuery.post/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多