【问题标题】:HttpPost with AJAX call help needed需要 AJAX 调用帮助的 HttpPost
【发布时间】:2013-01-22 11:51:20
【问题描述】:

请问我的代码中还需要什么,到目前为止我有这个:

  <script type="text/javascript">
 function PostNewsComment(newsId) {
  $.ajax({
    url: "<%= Url.Action("AddCommentOnNews", "Home", new { area = "News" }) %>?newsId=" + newsId + "&newsComment=" + $("#textareaforreply").val(), success: function (data) {
      $("#news-comment-content").html(data + $("#news-comment-content").html());
      type: 'POST'
    }
  });
}
$("#textareaforreply").val("");
</script>

和

    [HttpPost]
[NoCache]
public ActionResult AddCommentOnNews(int newsId, string newsComment)
{
  if (!String.IsNullOrWhiteSpace(newsComment))
  {
    var currentUser = ZincService.GetUserForId(CurrentUser.UserId);
    ZincService.NewsService.AddCommentOnNews(newsId, newsComment, currentUser.UserId);

    Zinc.DataModels.News.NewsCommentsDataModel model = new DataModels.News.NewsCommentsDataModel();
    var today = DateTime.UtcNow;
    model.CommentDateAndTime = today;
    model.NewsComment = newsComment;
    model.Firstname = currentUser.Firstname;
    model.Surname = currentUser.Surname;
    model.UserId = CurrentUser.UserId;
    return View("NewsComment", model);
  }

  return null;
}


<div class="actions-right">    
  <a href="javascript:PostNewsComment(<%: Model.News.NewsId %>);" class="button" id="post_button"><%: Html.Resource(Resources.Global.Button.Reply) %></a>                
</div>

我不知道这是如何工作的,因为它在 FF 中不起作用??? 另一件事是我不能通过 return null 我必须通过 JSON false ???

有什么帮助吗? 谢谢

【问题讨论】:

    标签: ajax json asp.net-mvc-3 http-post


    【解决方案1】:

    您应该对请求参数进行编码。现在你已经用强连接将它们连接到请求中,这是一种错误的方法。有一个名为 data 的属性允许您将参数传递给 AJAX 请求并将正确的 url 编码留给框架:

    function PostNewsComment(newsId) {
        $.ajax({
            url: '<%= Url.Action("AddCommentOnNews", "Home", new { area = "News" }) %>', 
            type: 'POST',
            data: { 
                newsId: newsId, 
                newsComment: $('#textareaforreply').val() 
            },
            success: function (data) {
                $('#news-comment-content').html(data + $('#news-comment-content').html());
            }
        });
    }
    

    此外,您还没有显示您在何处以及如何调用此 PostNewsComment 函数,但如果在单击链接或提交按钮时发生这种情况,请确保您已通过返回 false 取消默认操作,就像这样:

    $('#someLink').click(function() {
        PostNewsComment('123');
        return false;
    });
    

    另一件事是我不能通过 return null 我必须通过 JSON false ???

    在这种情况下,您可以让控制器操作返回 JsonResult:

    return Json(new { success = false });
    

    然后在你的成功回调中你可以测试这个条件:

    success: function (data) {
        if (!data.success) {
            // the server returned a Json result indicating a failure
            alert('Oops something bad happened on the server');
        } else {
            // the server returned the view => we can go ahead and update our DOM
            $('#news-comment-content').html(data + $('#news-comment-content').html());
        }
    }
    

    您可能应该注意的另一件事是评论文本中存在危险字符,例如&lt; 或&gt;。为了允许这些字符,我建议您构建一个视图模型并使用 [AllowHtml] 属性装饰相应的属性:

    public class NewsViewModel
    {
        public int NewsId { get; set; }
    
        [AllowHtml]
        [Required]
        public string NewsComment { get; set; }
    }
    

    现在您的控制器操作显然会将视图模型作为参数:

    [HttpPost]
    [NoCache]
    public ActionResult AddCommentOnNews(NewsViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            var currentUser = ZincService.GetUserForId(CurrentUser.UserId);
            ZincService.NewsService.AddCommentOnNews(viewModel.NewsId, viewModel.NewsComment, currentUser.UserId);
    
            var model = new DataModels.News.NewsCommentsDataModel();
            var today = DateTime.UtcNow;
            model.CommentDateAndTime = today;
            model.NewsComment = newsComment;
            model.Firstname = currentUser.Firstname;
            model.Surname = currentUser.Surname;
            model.UserId = CurrentUser.UserId;
            return View("NewsComment", model);
        }
    
        return Json(new { success = false });
    }
    

    【讨论】:

    • 非常感谢,但我认为仍然缺少一些东西,因为我收到了警报('糟糕,服务器上发生了一些糟糕的事情')??我的控制器中的返回调用了一个名为 NewsComment 的部分,请问我需要别的东西吗?谢谢
    • 调试服务器端控制器操作时发生了什么?动作参数是否正确传递?
    • In fire bug: newsComment aaaaaaaaaaaaaaaaaaaaaaaaaaaaa newsId 120 Source newsId=120&newsComment=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 动作参数包含正确的值
    • 太好了,您的控制器操作已使用正确的参数成功调用。
    • 那是因为您的控制器操作不返回视图,而是返回 Json。您是否验证了为什么您的if 语句不满意并且您没有达到return View 语句?
    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多