2013-04-20 155 views
11

我想学习MVC和我想要做的事情是提交表单到我的控制器中的一个动作,这个动作将返回提交的数据。听起来很简单,但我一直在努力几个小时没有任何成功。 我的观点:提交表单与jquery ajax

@using (Html.BeginForm("BlogComment","Blog")) 
{ 
    @Html.ValidationSummary(true) 
    <legend class="AddAComment">Add a comment</legend> 

    <div class="commentformwrapper"> 

     <div class="editor-text"> 
     <span class="editor-label">User Name:</span> 
     </div> 

     <div class="editor-text"> 
     <input type="text" id="username" /> 
     </div> 

     <div class="editor-text"> 
     <textarea id="comment" rows="6" cols="23"></textarea> 
     </div> 

     <div class="editor-field"> 
     <input type="hidden" id="hiddendate" /> 
     </div> 

     <input type="submit" id="submit" value="Create" /> 

    </div> 
} 

我的控制器:

[HttpPost] 
public ActionResult CommentForm(Comment comment) 
{ 
    Comment ajaxComment = new Comment(); 
    ajaxComment.CommentText = comment.UserName; 
    ajaxComment.DateCreated = comment.DateCreated; 
    ajaxComment.PostId = comment.PostId; 
    ajaxComment.UserName = comment.UserName; 

    mRep.Add(ajaxComment); 
    uow.Save(); 
    //Get all the comments for the given post id 

    return Json(ajaxComment); 
} 

和我的JS:

$(document).ready(function() { 

     $('form').submit(function() { 

      $.ajax({ 
       url: '@Url.Action("CommentForm")', 
       type: "POST", 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       data: { 
        PostId: $('.postid').val(), 
        UserName: $('#username').val(), 
        DateCreated: new Date(), 
        CommentText: $('#comment').val() 
       }, 
       success: function (result) { 

        alert("success " + result.UserName); 
       }, 
       error: function (result) { 
        alert("Failed"); 
       } 
      }); 
      return false; 
     }); 
    }); 
+0

你有什么问题?什么不起作用? – nemesv 2013-04-20 17:07:22

+0

你缺少JSON.stringify() – 2013-04-20 17:10:31

回答

10

基本上你是直接传递javascript对象文字。因此,在将数据传递给控制器​​之前,它必须采用JSON格式(因为您已指定application/json,请参阅您的$ .ajax调用)。
SO,你缺少JSON.stringify()

data: JSON.stringify({ 
         PostId: $('.postid').val(), 
         UserName: $('#username').val(), 
         DateCreated: new Date(), 
         CommentText: $('#comment').val() 
        }), 

OR

var someObj = { 
      PostId: $('.postid').val(), 
      UserName: $('#username').val(), 
      DateCreated: new Date(), 
      CommentText: $('#comment').val() 
     }; 

     $.ajax({ 
      /// your other code 
      data: JSON.stringify(someObj), 
      // your rest of the code 

     }); 
+0

这使它的工作表示感谢! – user2302622 2013-04-21 13:51:30

4

而不是

data: { 
      PostId: $('.postid').val(), 
      UserName: $('#username').val(), 
      DateCreated: new Date(), 
      CommentText: $('#comment').val() 
     }, 

尝试

$('form').submit(function() { 
    var obj = { 
     PostId: $('.postid').val(), 
     UserName: $('#username').val(), 
     DateCreated: new Date(), 
     CommentText: $('#comment').val() 
    }; 

    $.ajax({ 
     ..., 
     data: JSON.stringify(obj), 
     ..., 
    }); 

    return false; 
}); 

在将数据发送到服务器之前,您必须将数据转换为字符串。和JSON.stringify是否做这个工作

+0

我已经尝试过,完全像这样,它不工作。奇怪的是,我尝试了DotNet Dreamer所说的和它的工作。 – user2302622 2013-04-21 13:54:23

+0

这很奇怪,很荒谬。 DotNet Dreamer说的正是我所说的。这意味着,如果他的解决方案正在工作,那么我的解决方案正在工作 – 2013-04-22 03:07:35

21

你不需要客户端代码要做到这一点,仅供参考。

要在MVC中成功使用ajax方法,您需要执行以下操作。此键加入的AppSettings在web.config中:

<appSettings> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 

除了包括不显眼的AJAX脚本:

<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script> 

然后在表单创建的div容器,并与Ajax.BeginForm

取代Html.BeginForm
<div id="ajaxReplace"> 
@using (Ajax.BeginForm("BlogComment", "Blog", null, new AjaxOptions { UpdateTargetId = "ajaxReplace", OnSuccess = "doFunctionIfYouNeedTo", OnFailure = "ShowPopUpErrorIfYouWant" })) 
{ 
@Html.ValidationSummary(true) 
     <legend class="AddAComment">Add a comment</legend> 

     <div class="commentformwrapper"> 

      <div class="editor-text"> 
      <span class="editor-label">User Name:</span> 
      </div> 

      <div class="editor-text"> 
      <input type="text" id="username" /> 
      </div> 

      <div class="editor-text"> 
      <textarea id="comment" rows="6" cols="23"></textarea> 
      </div> 

      <div class="editor-field"> 
      <input type="hidden" id="hiddendate" /> 
      </div> 

      <input type="submit" id="submit" value="Create" /> 

     </div> 

    } 
</div> 

然后在您的控制器,你会回到这样的事情:

return PartialView(ajaxComment); 

这将节省您维护脚本手动执行此操作的时间,并且可以帮助您按预期使用框架。它也将帮助你与数据注释验证和所有与它一起的多汁的东西,

我希望这有助于某种方式。

+0

感谢您的建议,下次我会记住这一点。现在我只会坚持使用纯jQuery ajax。 – user2302622 2013-04-21 14:00:27

+2

我认为Jquery ajax具有丰富的灵活性,但是当涉及到验证摘要代码等MVC自身处理时,它将RenderPartialView与Json返回类型进行比较显然是胜利者。 – 2015-08-23 17:02:44

+0

@ShyamalParikh我同意你的陈述。我之前没有使用过上面的方法,它比自己接线更容易。我希望我早点知道这件事。再次感谢OP – 2016-11-01 17:57:05

13

试试这个:

示范

public class Comment 
{ 
    public string CommentText { get; set; } 
    public DateTime? DateCreated { get; set; } 
    public long PostId { get; set; } 
    public string UserName { get; set; } 
} 

查看和JS

@model SubmitMvcForWithJQueryAjax.Models.Comment 

@using (Html.BeginForm("BlogComment","Blog")) 
{ 
    @Html.ValidationSummary(true) 
    <legend class="AddAComment">Add a comment</legend> 

    <div class="commentformwrapper"> 

     <div class="editor-text"> 
     <span class="editor-label">User Name:</span> 
     </div> 

     <div class="editor-text"> 
      @Html.EditorFor(m => m.UserName) 
     </div> 

     <div class="editor-text"> 
      @Html.TextAreaFor(m => m.CommentText, new { rows="6", cols="23"}) 
     </div> 

     <div class="editor-field"> 
      @Html.HiddenFor(m => m.DateCreated)   
     </div> 

     <div class="editor-field"> 
      @Html.HiddenFor(m => m.PostId)   
     </div> 

     <input type="submit" id="submit" value="Create" /> 

    </div> 

} 

<script type="text/javascript"> 
    $(document).ready(function() { 

     $('form').submit(function() { 
      var serializedForm = $(this).serialize();      
      $.ajax({ 
       url: '@Url.Action("CommentForm")', 
       type: "POST",          
       data: serializedForm, 
       success: function (result) { 

        alert("success " + result.UserName); 
       }, 
       error: function (result) { 
        alert("Failed"); 
       } 

      }); 
      return false; 
     }); 
    }); 

</script> 

的控制器

public class CommentController : Controller 
{ 
    // 
    // GET: /Comment/ 

    public ActionResult Index() 
    { 
     return View(new Comment()); 
    } 

    [HttpPost] 
    public ActionResult CommentForm(Comment comment) 
    { 
     Comment ajaxComment = new Comment(); 
     ajaxComment.CommentText = comment.UserName; 
     ajaxComment.DateCreated = comment.DateCreated ?? DateTime.Now; 
     ajaxComment.PostId = comment.PostId; 
     ajaxComment.UserName = comment.UserName; 

     //mRep.Add(ajaxComment); 
     //uow.Save(); 
     //Get all the comments for the given post id 

     return Json(ajaxComment); 


    } 

} 
+0

感谢您的建议,但我相信我的观点必须强制键入(评论)序列化工作,这不是我的情况。 – user2302622 2013-04-21 13:52:49