2

ここで少し奇妙です。新しいイントラネットの利点を強調する別の「MVC に足を踏み入れる」プロジェクトであるブログがあります。記事、コメント、および特定の記事に対するコメントを送信するためのフォームを含む典型的なブログ投稿ページがあります。

記事のコンテンツを含む文字列型のメイン ビュー ("Post") と、2 つの Html.RenderAction メソッドがあります。1 つはコメントを取得するためのもので、もう 1 つはフォームを介してコメントを追加するためのものです。

私の問題は、コメントが投稿されると、GetComments メソッドが AddComment の前に呼び出されるため、ページが更新されると、新しいコメントがデータベースに追加されても表示されないことです。F5 をすばやく押すと、これが確認されます。ビューで最初に宣言されているため、GetComments が最初に呼び出されていることは理解していますが、取得の前に追加を行うようにビューに指示する方法がわかりません。

これが私のコードです:

コントローラ:

public ActionResult AddComment()
    {
        return PartialView("AddComment");
    }

    [HttpPost]
    public ActionResult AddComment(Comment comment)
    {
        comment.DateSubmitted = DateTime.Now;
        db.Comments.Add(comment);
        db.SaveChanges();
        return PartialView(comment);
    }

    public ActionResult GetComments(int articleid)
    {
        var comments = db.Comments.Where(c => c.ArticleID == articleid).ToList();
        return PartialView(comments);
    }

投稿ビュー

@model IntranetBlog.Models.Article

@{
ViewBag.Title = "Post";
}

 <div class="row">
<div class="span12">
    <h3>@Html.DisplayFor(modelItem => Model.Title)</h3>
    <small>by Ruth Barlow on @Html.DisplayFor(modelItem => Model.DateCreated)</small>
    @if (Model.Image != null)
    {
        <p>
            <img src="@Url.Action("GetImage", "Home", new { articleID = Model.ArticleID     })" alt="" width="150" height="150" />
        </p>
    }

    <div>
        @Html.DisplayFor(modelItem => Model.Body)
    </div>
    <small>Posted under @Html.DisplayFor(modelItem => Model.Category.Name)</small>
</div>
<div class="span12">
    @{
        Html.RenderAction("GetComments", "Home", new { articleID = Model.ArticleID });
    }
</div>
<div class="span12">
    @{
        Html.RenderAction("AddComment", "Home", new { articleID = Model.ArticleID });
    }
</div>
</div>

GetComments パーシャル:

@model IEnumerable<IntranetBlog.Models.Comment>

@if (Model.Any())
{
<h3>What you're saying</h3>
foreach (var item in Model)
{
    <div>
        Comment: @Html.DisplayFor(modelItem => item.Body)
    </div>
    <div>
        Submitted by: @Html.DisplayFor(modelItem => item.SubmittedBy) 
on @Html.DisplayFor(modelItem => item.DateSubmitted)
    </div>
    <hr />
}
}
else
{
  <p>There are no comments for this post. Why not add one?</p>
}

AddComment パーシャル

@model IntranetBlog.Models.Comment

@using (Html.BeginForm())
{
<h3>Why not leave us a comment?</h3>
@Html.ValidationSummary()
<fieldset>
    <div class="editor-label">
        @Html.LabelFor(model => model.Body)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Body, 20, 20, null)
        @Html.ValidationMessageFor(model => model.Body)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.SubmittedBy)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.SubmittedBy)
        @Html.ValidationMessageFor(model => model.SubmittedBy)
    </div>

    <p>
        <input type="submit" value="Add comment" id="AddComment" class="btn btn-    primary" />
    </p>
</fieldset>
}

これが理にかなっていることを願っています。前もって感謝します。

4

2 に答える 2

1

Html.Actionこれの代わりに使用するトリックはHtml.RenderAction、結果を変数に格納し、必要な場所に表示に追加できるようにすることです。

これにより、必要な論理的な順序で PartialView を生成し、別の順序で表示することができます。

それを行う方法の簡単な例については、この投稿を参照してください: https://stackoverflow.com/a/13301057/971693

于 2012-11-19T14:55:14.327 に答える
0

少し違うアプローチをお勧めします。Html.BeginForm を使用する代わりに、Ajax.BeginForm を使用してコメントを送信することを検討してください。ajaxであるため、メソッドがコメントを返すだけで古いものを置き換えることができ、新しく追加されたものだけをリストの一番下に追加できるため、パフォーマンスが向上します。そうは言っても、このソリューションはjavascriptの使用に依存しており、できればjquery-unobtrusive-ajaxを使用して機能し、見栄えの良いクライアントコードをレンダリングします。AjaxOptions クラスのおかげで、このメソッドを使用するために JavaScript を知る必要はありません。このクラスには、強力でありながら使いやすいオプションが組み込まれています。

于 2012-11-19T14:59:27.267 に答える