2009-07-22 9 views
0

私の例でコメントを追加すると、マイページがリフレッシュされます。 私は何が間違っていますか?ActionResultへのjQuery ajax呼び出しを作成するときにページがリフレッシュされる

詳細ページのコメントを更新して、ページを更新しないでください。
StackOverflowでここにコメントを追加する方法とよく似たことをしようとしています。
My Details.aspxにはIssuesのリストがあり、クリックするとDetails/idページに移動し、Issueのすべてのコメントが表示されます。コメントはpartialview経由で読み込まれます。詳細ページには、ActionResultメソッド(AddComment)を呼び出してコメントをデータベースに追加し、部分的なビューを返すフォームがあります。

データベース

CREATE TABLE [dbo].[Comment](
[CommentId] [int] IDENTITY(1,1) NOT NULL, 
[IssueId] [int] NOT NULL, 
[Comment] [varchar](50) NULL, 
CONSTRAINT [PK_Comment] PRIMARY KEY CLUSTERED 
(
[CommentId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Issue](
[IssueId] [int] IDENTITY(1,1) NOT NULL, 
[Title] [varchar](50) NULL, 
CONSTRAINT [PK_Issue] PRIMARY KEY CLUSTERED 
(
[IssueId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

Index.aspx

<p><ul> 
<% foreach (var item in (IEnumerable<PartialUpdates.Models.Issue>)Model) 
    { %> 
<li> 

<a href="<%= Url.RouteUrl("Default", new { id = item.IssueId, controller = "Home", action = "Details" })%>"><%= item.Title%></a> 
</li> 
<% } %> 
</ul> </p> 

Details.aspx

<fieldset> 
    <legend>Fields</legend> 
    <p> 
     IssueId: 
     <%= Html.Encode(Model.Issue.IssueId) %> 
    </p> 
    <p> 
     Title: 
     <%= Html.Encode(Model.Issue.Title) %> 
    </p> 
    <div id="issueComments"> 
    <% Html.RenderPartial("Comments", Model.Comments); %> 
    </div> 

    <div id="issue-comment-form"> 
<form id="form-comments-<%= Html.Encode(Model.Issue.IssueId) %>" class="post-comments"> 
<table><tr><td><textarea class="wmd-ignore" name="comment" cols="68" rows="3" id="form-comment-<%= Html.Encode(Model.Issue.IssueId) %>"></textarea> 
<input type="submit" value="Add Comment" /></td></tr><tr><td><span class="text-counter"></span> 
<span class="form-error"></span></td></tr></table> 
</form></div> 

</fieldset> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $("#form-comments-<%= Html.Encode(Model.Issue.IssueId) %>").submit(function(evt) {    
     var frm = $("#form-comments-<%= Html.Encode(Model.Issue.IssueId) %>"); 
     var action = frm.attr("action"); 
     var serializedForm = frm.serialize(); 
     var comments = jQuery.trim($("#form-comment-<%= Html.Encode(Model.Issue.IssueId) %>").val()); 
     if (comments.length < 1) 
      return; 
     AjaxPostComment("<%= Html.Encode(Model.Issue.IssueId) %>", comments); 

    }); 
}); 
function AjaxPostComment(issueId, comments) { 
    $.ajax({ 
     type: "POST", 
     url: "/Home/" + "AddComment", 
     dataType: "html", 
     data: { 
      comment: comments, 
      id: issueId 
     }, 
     success: function(v) { 
      RefreshComment(v); 

     }, 
     error: function(v, x, w) { 
      //Error 
      alert('error: ' + v); 
      alert('error: ' + x); 
      alert('error: ' + w); 
      return false; 
     } 
    }); 
} 
function RefreshComment(v) { 

    $("div#issueComments").html(v); 
    return false; 
    if (v == "true") { 
     $("#issueComments").load("CommentHistory"); 
     //$("div#issueComments").html(v);// does this work? 
    } 
    else { 
    } 
} 
</script> 

IssuePageViewModel

public class IssuePageViewModel 
{ 
    public IEnumerable<Issue> Issues { get; private set; } 
    public IEnumerable<Comment> Comments { get; private set; } 
    public Issue Issue { get; private set; } 

    public IssuePageViewModel(Issue issue, IEnumerable<Comment> issueComments) 
    { 
     this.Issue = issue; 
     this.Comments = issueComments; 
    } 
} 

HomeController.cs

 MyMVCSamplesDBEntities _db; 

    public HomeController() 
    { 
     _db = new MyMVCSamplesDBEntities(); 
    } 

    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
     ViewData.Model = (from i in _db.Issue select i).ToList(); 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 

    public ActionResult Details(int? id) 
    { 
     Issue issue = _db.Issue.First(i => i.IssueId == id); 
     var comments = _db.Comment.Where(x => x.IssueId == id).ToList(); 
     IssuePageViewModel viewData = new IssuePageViewModel(issue, comments); 

     return View(viewData); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AddComment(int id, string comment) 
    { 
     Comment com = new Comment(); 
     com.Comment1 = comment; 
     com.CommentId = id; 
     com.IssueId = id; 
     _db.AddToComment(com); 
     _db.SaveChanges(true); 

     var comments = _db.Comment.Where(x => x.IssueId == id).ToList(); 
     ViewData["NewComments"] = comments; 
     if (Request.IsAjaxRequest()) 
     { 
      return PartialView("Comments", ViewData["NewComments"]); 
     } 
     else 
     { 
      return View(); 
     } 
    } 

マスター

<head runat="server"> 
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
<script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> 
<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
</head> 

答えて

2

jQueryフォームのsubmit()メソッドでは、実際の送信が行われないようにはなっていません。あなたはその機能のどこかでevt.preventDefault();を実行する必要があります。

+0

:-))ありがとう。今すぐ次の仕事に。 – Picflight

1

私はおそらく、このためのいくつかのdownvotesを取るよ、と私も通じ読んでいませんあなたのコードはどれも、99%は「ページをリフレッシュする」と「Javascript」がポイントになる傾向がありますイベントハンドラ(例:submit)のJavascript構文エラー、またはイベントのデフォルトアクションを防止できない場合に発生します。

+0

jQueryとMVCが初めてのので、私はすべてのコードを投稿します。私は文法エラーがある場合、それがどこにあるのか分かりません。私はform = "post"をフォームに追加しようとしましたが、POSTをGETに変更したり、.ajax呼び出しでPOSTを変更したりしましたが、それでも同じことが行われます。 – Picflight

3

ActionResultメソッド(AddComment)を呼び出してデータベースにコメントを追加し、部分的なビューを返すフォームが詳細ページにあります。あなたのjQueryフォームsubmit()メソッドは実際の提出が行われるのを妨げません。あなたはその機能のどこかでevt.preventDefault();を実行する必要があります。

関連する問題