在asp.net mvc3中重新分解Controller的Action

时间:2012-01-13 08:15:24

标签: c# asp.net-mvc asp.net-mvc-3 refactoring

我正在为不同的Models编写此Action代码(在同一个控制器中)超过10次。有什么办法可以减少这个代码,或者我怎样才能创建一个通用的动作。

    [HttpPost]
    public ActionResult SavePerson(Person p)
    {
        if (ModelState.IsValid)
        {
            //do something
            return Redirect("/Main");
        }
        else
        {
            return View();
        }
    }


    [HttpPost]
    public ActionResult SaveCategory(Category c)
    {
        if (ModelState.IsValid)
        {
            //do something
            return Redirect("/Main");
        }
        else
        {
            return View();
        }
    }

3 个答案:

答案 0 :(得分:5)

重点是//do something部分始终因行动而异。因此,让我们尝试减少除此之外的所有代码。您可以使用基本控制器

public class BaseController : Controller
{
    [NonAction]
    protected virtual ActionResult HandlePost<T>(T model, Action<T> processValidModel)
    {
        if (ModelState.IsValid)
        {
            processValidModel(model);
            return RedirectToAction("Main");
        }
        else
        {
            return View(model);
        }
    }
}

在派生控制器中

public class DerivedController : BaseController
{
    [HttpPost]
    public ActionResult Create(Person person)
    {
       return HandlePost(person, p => _repository.Save(p));
    }
}

答案 1 :(得分:0)

return ModelState.IsValid ? Redirect("/Main"):View();

作为起点将是您需要的唯一一条线。

答案 2 :(得分:-2)

对于过于频繁调用的函数,创建一个静态类并在其中定义所有这些函数。

例如如下

public static class MyAppStaticClass
{
    public static SavePerson(Person p)
    {
        ... // your body
    }
}

然后,您可以在需要时将其引用为MyAppStaticClass.SavePerson