Podczas dodawania kontrolera do modelu, wygenerowane działania będą wyglądać takAutomatycznie przechodzą jednostki do działania kontrolera
public ActionResult Edit(int id = 0)
{
Entity entity = db.Entities.Find(id);
if (entity == null)
{
return HttpNotFound();
}
return View(entity);
}
Teraz w moim przypadku podjęcia id ciąg, który można mapować do DB identyfikatorów w kilku sposoby, tworząc kilka linii kodu dla odzyskania właściwego obiektu. Skopiowanie & wklejenia tego kodu do każdej akcji, która pobiera identyfikator w celu pobrania obiektu, wydaje się bardzo nieeleganckie.
Umieszczenie kodu identyfikacyjnego w prywatnym funkcji regulatora zmniejsza ilość duplikatu kodu, ale ja wciąż pozostaje tym:
var entity = GetEntityById(id);
if (entity == null)
return HttpNotFound();
Czy istnieje sposób, aby przeprowadzić wyszukiwanie w atrybucie i przekazać podmiot do działania? Pochodzące z Pythona, można to łatwo osiągnąć za pomocą dekoratora. Udało mi się zrobić coś podobnego dla usług WCF, wprowadzając IOperationBehavior
, który nadal nie wydaje się być prosty. Ponieważ pobieranie obiektu według identyfikatora jest czymś, co często musisz zrobić, spodziewam się, że istnieje inny sposób niż kopiowanie kodu.
Idealnie byłoby to wyglądać mniej więcej tak:
[EntityLookup(id => db.Entities.Find(id))]
public ActionResult Edit(Entity entity)
{
return View(entity);
}
gdzie EntityLookup
wykonuje dowolną funkcję mapowania string id
do Entity
i albo zwraca HttpNotFound
lub wywołuje działania z pobranym podmiotu jako parametr.
Czy rozważałeś o wyrażeniach lambda w LINQ ?, co można to, że możesz mieć oddzielną warstwę dostępu do danych, w której możesz pisać funkcje pobierania danych i wywoływać je w ramach metod działania (rozdzielanie problemów). :), Jeśli zamierzasz wykonywać prywatne metody dla każdego pobierania, w kontrolerach będzie wiele linii kodów. –
1. Nadal możesz umieścić swoją walidację bezpośrednio w 'GetEntityById'. 2. Prawdopodobnie szukasz niestandardowego spoiwa do modelu. –