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 ビューにリダイレクトすることはできません。
事前に助けてくれてありがとう!