我正在使用 Asp.Net MVC 3 编写我的应用程序。在我的控制器中,我有两个动作方法,除了一行之外,它们的代码完全相同。这里是:
[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) 还尝试重定向到 HelperPost 方法,而不是使用 AddPost 和 EditPost 调用它。结果还是一样:似乎 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 视图。
提前感谢您的帮助!