3

コメント付きのブログ投稿ページがあります。すべてのユーザー (ログインしているかどうかに関係なく) は、ページの下部にあるフォームを表示してコメントを投稿できます。ユーザーがコメントを入力し、承認されていない場合、ユーザーはログイン/サインアップ ページにリダイレクトされます。ログイン後、ユーザーはアクションにリダイレクトされますが、コメント本文を含む POST データは失われます。

ASP.NET MVC Authorize 属性を使用して、一部のアクションで承認を要求します。

[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Create(int blogPostID, string commentBody) {
    var comment = new Comment {
       Body = commentBody,
       BlogPostID = blogPostID,
       UserName = User.Identity.Name
    }
    // persist the comment and redirect to a blog post page with recently added comment
}

この問題をどのように解決しますか?

コメントフォームを表示する前にユーザーログインを行うのは、ここでは悪い考えだと思います。

ありがとう。

4

2 に答える 2

3

おそらく、siteId を保存してセッションにコメントするだけです。次に、パラメーターを取らない Create の別のオーバーロードを作成します。これらの変数がセッションに存在するかどうかを確認します。存在する場合は、元の Create メソッドに渡します。

そのためには、Authorize 属性を削除して、自分でセキュリティ チェックを行う必要があります。このようなもの:

var user = HttpContext.User;

if (!user.Identity.IsAuthenticated)
{ 
   Session["Comment"] = comment;
   Session["SiteId"] = siteId;
   return RedirectToAction("LogOn", "Account", 
                           new { returnUrl = "/ControllerName/Create"} );
}

次に、オーバーロードされた作成:

public ActionResult Create()
{
    var comment = (Session["Comment"] ?? "").ToString();
    int siteId = 0;
    if (Session["siteId"] != null)
        siteId = (int)Session["siteId"];

    return Create(siteId, comment);
}

もちろん、これはそれほど一般的なものではなく、より複雑なシナリオを処理するものではありませんが、これはアイデアです。(上記のコードが機能することを願っています。テストする機会がありませんでした)。アクションフィルターを介してこのようなことを行うことができるようですが、そのためのサンプルコードはありません。

于 2012-04-10T21:48:44.153 に答える
1

認証フォームで隠しフィールドを使用できます。ユーザーのコメントをそのフィールド (最初の POST データ) に入力します。その後、承認フォームが単にコメント フォームにリダイレクトするだけの場合、コメント フォームのデータを使用することはできません。承認フォームをコメントフォームに投稿すると、非表示フィールドのデータも投稿されるので、それを使用できます。

于 2012-04-10T21:42:37.163 に答える