Большинство людей предложат использовать «Шаблон репозитория» для перемещения кода доступа к данным из контроллера (и для включения модульного тестирования с фиктивными объектами вместо реальной базы данных).
Вот несколько мест, где можно прочитать подробнее:
Редактировать:
Я настоятельно рекомендую прочитать всю главу о Скотте Гатри, связанную выше. В нем много полезных советов. Тем не менее, вот некоторые соответствующие примеры (за исключением главы) ...
Во-первых, мне обычно нравятся разные действия для «Обновления» и «Добавить». Даже если они представляют собой одно и то же представление для отображения формы, обычно удобнее иметь разные URL-адреса для размещения изменений по сравнению с размещением новых записей. Итак, вот как выглядит используемый шаблон репозитория в действии обновления контроллера:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
//get the current object from the database using the repository class
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
//update the object with the values submitted
UpdateModel(dinner);
//save the changes
dinnerRepository.Save();
//redirect the user back to the read-only action for what they just edited
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
//exception occurred, probably from UpdateModel, so handle the validation errors
// (read the full chapter to learn what this extention method is)
ModelState.AddRuleViolations(dinner.GetRuleViolations());
//render a view that re-shows the form with the validation rules shown
return View(dinner);
}
}
Вот пример "Добавить":
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create()
{
//create a new empty object
Dinner dinner = new Dinner();
try
{
//populate it with the values submitted
UpdateModel(dinner);
//add it to the database
dinnerRepository.Add(dinner);
//save the changes
dinnerRepository.Save();
//redirect the user back to the read-only action for what they just added
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
//exception occurred, probably from UpdateModel, so handle the validation errors
// (read the full chapter to learn what this extention method is)
ModelState.AddRuleViolations(dinner.GetRuleViolations());
//render a view that re-shows the form with the validation rules shown
return View(dinner);
}
}
Для обоих приведенных выше примеров DinnerRepository выглядит следующим образом:
public class DinnerRepository
{
private NerdDinnerDataContext db = new NerdDinnerDataContext();
//
// Query Methods
public IQueryable<Dinner> FindAllDinners()
{
return db.Dinners;
}
public IQueryable<Dinner> FindUpcomingDinners()
{
return from dinner in db.Dinners
where dinner.EventDate > DateTime.Now
orderby dinner.EventDate
select dinner;
}
public Dinner GetDinner(int id)
{
return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}
//
// Insert/Delete Methods
public void Add(Dinner dinner)
{
db.Dinners.InsertOnSubmit(dinner);
}
public void Delete(Dinner dinner)
{
db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);
db.Dinners.DeleteOnSubmit(dinner);
}
//
// Persistence
public void Save()
{
db.SubmitChanges();
}
}