1

我正在使用 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 视图。

提前感谢您的帮助!

4

2 回答 2

1

只需将您的“返回内容”链接放入模型中,然后对两者使用相同的视图,然后您就可以使用相同的HttpPost方法。无需复制所有内容。

于 2013-01-21T12:32:02.383 回答
0

我会这样解决它:

  1. 我会将方法实现撤回到单独的私有 方法中。每个公共操作方法都将调用此方法。由于两种方法的视图名称不同,我会将视图名称作为参数传递给私有方法。
  2. 私有方法不需要 HttpPostAttribute!
  3. 不要忘记将 Add 和 Edit 操作方法声明为返回 ActionResult!作为参数,他们只期望 Post,视图名称必须硬编码到操作方法中;-)

我希望这有帮助。

于 2013-01-21T12:44:31.407 回答