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

Rus*_*ova 2 c# asp.net-mvc refactoring asp.net-mvc-3

我正在为不同的代码编写这个Action代码(在同一个控制器中)10次以上Models.有什么方法可以减少这个代码或如何创建一个通用的操作.

    [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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

arc*_*hil 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在派生控制器

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