1

Asp.Net MVC 3 を使用してアプリを作成しています。コントローラーには、1 行を除いてまったく同じコードを持つ 2 つのアクション メソッドがあります。ここにあります:

    [HttpPost]
    public ActionResult EditPost(Post post)
    {
        if (ModelState.IsValid)
        {
            _postsRepository.UpdatePost(post);
            return RedirectToAction("NewsFeed");
        }
        return View("EditPost", post);
    }

    [HttpPost]
    public ActionResult AddPost(Post post)
    {
        if (ModelState.IsValid)
        {
            _postsRepository.UpdatePost(post);
            return RedirectToAction("NewsFeed");
        }
        return View("AddPost", post); // the return view is different 
    }

したがって、このコードをすべてヘルパー メソッドに組み込みたいと思います。

私がすでに試したこと:

1) すべてのコードをヘルパー メソッドに入れ、パラメーターとして ModelState.IsValid およびビュー名を渡そうとしました。そして AddPost と EditPost で、上記のコードの代わりにこのヘルパー メソッドを呼び出します。新しいコードは次のとおりです。

    [HttpPost] // also tried without this attribute
    public ActionResult HelperPost(Post post, string viewName, bool modelState)
    {
        if (modelState)
        {
            _postsRepository.UpdatePost(post);
            return RedirectToAction("NewsFeed");
        }
        return View(viewName, post);
    }

    [HttpPost] // also tried without this attribute
    public void AddPost(Post post)
    {
        HelperPost(post, "AddPost", ModelState.IsValid);
    }

EditPost コードはほとんど同じです。ビュー名は「EditPost」です。

アプリを実行して AddPost メソッドを実行すると、検証が機能し、新しい投稿が作成されますが、この行は実行されません。

return RedirectToAction("NewsFeed");

そのため、「AddPost」ビューに何度もリダイレクトされます。

2) また、AddPost および EditPost で呼び出す代わりに、HelperPost メソッドにリダイレクトしようとしました。結果は同じです: RedirectToAction("NewsFeed") が実行されないようです。(ここでは、例を単純化するためだけに検証を無視しました。プロパティを使用して新しいモデルを作成する必要があるためです: Post post、string viewName、bool modelState)。コード:

[HttpPost] // tried without attribute
public void AddPost(Post post)
{
   return RedirectToAction("HelperPost", post);
}

[HttpPost] // tried without attribute
public RedirectToRouteResult HelperUpdatePost(Post post)
{
    _postsRepository.UpdatePost(post);
    return RedirectToAction("NewsFeed");
}

では、アクション メソッド (EditPost と AddPost) に同じコードのチャンクが含まれないように、コードをリファクタリングするにはどうすればよいでしょうか?

ps AddPost メソッドと EditPost メソッドに異なるビューが必要なため、それらの「コンテンツに戻る」リンクが異なります。そのため、AddPost メソッドから EditPost ビューにリダイレクトすることはできません。

事前に助けてくれてありがとう!

4

2 に答える 2

1

モデルに「コンテンツに戻る」リンクを配置し、両方に同じビューを使用するだけで、同じHttpPost方法を使用できます。すべてを複製する必要がなくなります。

于 2013-01-21T12:32:02.383 に答える
0

私は次のようにそれを解決します:

  1. メソッドの実装を別のプライベート メソッドに撤回します。このメソッドは、各パブリック アクション メソッドによって呼び出されます。ビュー名は両方のメソッドで異なるため、ビュー名をパラメーターとしてプライベート メソッドに渡します。
  2. プライベート メソッドは HttpPostAttribute を必要としません!
  3. ActionResult を返すように Add および Edit アクション メソッドを宣言することを忘れないでください。パラメーターとして Post のみを期待するため、ビュー名をアクション メソッドサイトにハードコードする必要があります ;-)

これが役立つことを願っています。

于 2013-01-21T12:44:31.407 に答える