Рефакторинг действий контроллера в asp.net mvc3 - PullRequest
2 голосов
/ 13 января 2012

Я пишу этот код действия (в пределах одного контроллера) более 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();
        }
    }

Ответы [ 3 ]

5 голосов
/ 13 января 2012

Суть в том, что //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));
    }
}
0 голосов
/ 13 января 2012
return ModelState.IsValid ? Redirect("/Main"):View();

в качестве начальной точки будет единственной необходимой вам линией.

0 голосов
/ 13 января 2012

Для функций, которые будут вызываться слишком часто, создайте статический класс и определите все такие функции в нем.

, например, например, как

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

Затем вы можете обратиться кэто как MyAppStaticClass.SavePerson всякий раз, когда вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...