ASP.NET MVC - 重用动作行为(ASP.NET MVC - Reusing Action

2019-09-24 06:46发布

这个问题涉及主要是良好的设计。

假设我有这样一个删除页面控制器动作,可以在同一个控制器的两个独立的观点来调用。 假设删除逻辑是不包含在行动本身,而是一些有条件的检查和调用正确的业务逻辑等等,它没有意义的重复删除操作的结构时,我可以代替有私人方法返回一个ActionResult这是我在这会导致删除这两个操作调用。 我的问题是在哪里是把这样的可重复使用的操作方法最好的地方? 现在,我只是将它们标记私下和控制器类的区域坚持他们,但也许是一个密封的内部类将更有意义,这样的方法 - 或其他地方完全。

思考?

public ActionResult EditPage(int id, FormCollection formCollection)
{
    var page = _pagesRepository.GetPage(id);

    if (page == null)
        return View("NotFound");
    if (page.IsProtected)
        return View("IllegalOperation");

    if (formCollection["btnSave"] != null)
    {
        //...
    }
    else if (formCollection["btnDelete"] != null)
    {
        return DeletePage(page);
    }
    return RedirectToAction("Index");
}

public ActionResult DeletePage(int id)
{
    var page = _pagesRepository.GetPage(id);

    if (page == null)
        return View("NotFound");

    return DeletePage(page);
}

// Reusable Action
private RedirectToRouteResult DeletePage(Page page)
{
    if(page != null && !page.IsProtected)
    {
        _pagesRepository.Delete(page);
        _pagesRepository.Save();

        FlashMessage(string.Format(PageForms.PageDeleted, page.Name), MessageType.Success);

        return RedirectToAction("Index");
    }
    return RedirectToAction("Index");
}

Answer 1:

我不明白为什么你需要让你的可重复使用的方法的操作方法。 为什么不返回void /布尔/等指示的结果的私有方法保存,让你的公共行动方法返回RedirectToAction()? 有效的是同样的结果,但我认为这是一个清晰的方法。

public ActionResult DeletePage(int id)
{
        var page = _pagesRepository.GetPage(id);

        if (page == null)
                return View("NotFound");

        DeletePage(page);
        return RedirectToAction("Index");
}

//reusable method
private void DeletePage(Page page)
{
    //your same validation/save logic here
}

在未来你可能会考虑移动这个私有方法删除页面进入执行验证和/或保存一个独立的服务类。 返回的一个ActionResult铁定不会在这种情况下意义,所以我觉得这个例子是为您的方案更合适的方法。



Answer 2:

在我看来,你的可重用的代码是一个行动,因为它返回一个ActionResult。 所以,你的应用是很好。 该DeletePage(Page page)可能保持公开。

我期待着其他人的意见。



Answer 3:

我个人同意库尔特。 删除未受保护的页面的概念应该从控制器应该执行什么操作脱钩。 其次,它是一个从代码网页时保护会发生什么混乱。 在一个动作它重定向到索引中,在所述第二重定向到了“IllegalOperation”图。 个人而言,我会做一些事情有点像...

public ActionResult DeletePage(int id) {
    var page = _pagesRepository.GetPage(id);
    if (!PageIsValidForDeletion(page)) {
         string invalidPageView = FindViewForInvalidPage(page);
         return View(invalidPageView);
    }
    DeletePage(page);
    return RedirectToAction("Index");
}


文章来源: ASP.NET MVC - Reusing Action Behaviors