Zaštićene akcije na kontroleru bi uvek trebao da dekorišeš sa
Authorize atributom, čak i ako nemaš link ka toj akciji na
view-u, jer korisnik može da ukuca šta god hoće u URL i onda nastaje haos. Redosled izvršavanja je takav da se uvek prvo izvrši
Action Filter pa tek onda kod koji se nalazi u kontroleru.
Ukoliko su sve akcije na kontroleru zaštićene, onda možeš da dekorišeš samo kontroler sa nekim atributom umesto da dekorišeš svaku akciju posebno.
U kontroleru ispitaj da li je korisnik autorizovan i tu vrednost prosledi na
View:
Code:
public ActionResult Index()
{
var viewModel = new HomeViewModel();
...
viewModel.IsAuthorized = ...
return View(viewModel);
}
[Authorize(Roles="Manager")]
public ActionResult Delete(int id)
{
...
}
i na
View samo ispitaš taj uslov:
Code:
@if(Model.IsAuthorized)
{
<a href="@Url.Action("Delete", "Home", new { id = ... } )">Delete</a>
}
Ukoliko ti je smor da na svakom
View-u proveravaš taj uslov i generišeš link, možeš da napraviš
custom HTML helper i time uštediš malo vremena.
http://weblogs.asp.net/scottgu...elper-syntax-within-razor.aspx
Generalno sva biznis logika (da li je korisnik autorizovan da uradi nešto itd.) se nikada ne piše u
View jer možeš vrlo lako da se pogubiš šta ide u kontroler, šta ide u
View, a šta ide u neke druge slojeve tvoje aplikacije...
Ja to radim ovako:
-
Repository za data access i on nikada nije referenciran u web projektu
-
Service kao proxy i za svu biznis logiku, keširanja, itd. On je referenciran u web projektu i ako ti je potreban pristup
Repository-u, to ide preko njega
-
Controller poziva
Service, domenske modele mapira u
ViewModel-e i poziva odgovorajući
View
-
View iscrtava samo ono što mu je prosleđeno preko
ViewModel-a. Ne sadrži nikakvu logiku osim prostih
foreach i
if petlji
Od alata gotovo uvek koristim AutoMapper, StructureMap i Elmah.
[Ovu poruku je menjao Dejan Carić dana 28.12.2011. u 10:12 GMT+1]