Walidacja danych w ASP.NET MVC 1. Prosta walidacja 2. Walidacja z Data Annotation public ActionResult Edit(Person person) bool blad = false; if(person.name.trim().length == 0) ViewData["Blad1"] = "Nazwisko użytkownika jest wymagane" blad = true; if(person.age < 0 person.age > 120) ViewData["Blad2"] = "Błędny zakres wieku osoby" blad = true; if(blad==false) csi.savedata(person); return RedirectToAction("index"); else return View(person); Właściwości: IsValid Metody: AddModelError(string key, Exception exception) AddModelError(string key, string errormessage) IsValidField(string key) 1
public ActionResult Edit(Person person) if(person.name.trim().length == 0) ModelState.AddModelError("Name", "Nazwisko użytkownika jest wymagane"); if(person.age > 0 && person.age < 120) ModelState.AddModelError("Age", "Niepoprawy zakres"); if(modelstate.isvalid) csi.savedata(person); return RedirectToAction("index"); else return View(person); if(modelstate.isvalid) csi.savedata(person); return RedirectToAction("index"); else return View(person); DEMO Range RegularExpression Required StringLength DataType 2
Reguły walidacji w ASP.NET MVC zapisuje się za pomocą tzw. Data Annotations class Person public string Name set; get; public int Age set; get; public string PhoneNumber set; get; class Person [Required] [StringLength(50)] public string Name set; get; [Range(0, 100)] public int Age set; get; [RegularExpression(@"(\d3)-\d3-\d3")] public string PhoneNumber set; get; class Person [Required(ErrorMessage = "Pole wymagane")] [StringLength(50, ErrorMessage = "Długość nie większa niż 50 znaków")] public string Name set; get; [Range(0, 100)] public int Age set; get; [RegularExpression(@"(\d3)-\d3-\d3")] public string PhoneNumber set; get; public ActionResult Create(Person data) if(modelstate.isvalid) csi.savedata(person); return RedirectToAction("index"); else return View(person); 3
DEMO [AttributeUsage(AttributeTargets.Property AttributeTargets.Field, AllowMultiple = false, Inherited = true)] public class EvenAttribute : ValidationAttribute public EvenAttribute() public override bool IsValid(object value) if(value == null) return true; else return (value as int)%2 == 0? true : false; Autentykacja w ASP.NET MVC Autentykacja proces rozpoznawania użytkownika na podstawie dostarczonych informacji. Autoryzacja proces sprawdzania czy użytkownik ma dostateczne uprawnienia do wykonania żądanej czynności. 4
Narzędzie do konfiguracji stron ASP.NET dostarczane razem z Visual Studio. Uruchamiane z menu Project > ASP.NET Configuration Jeżeli razem z Visual Studio został zainstalowany SQL Server Express Edition, to informacje o użytkownikach, rolach itd. są przechowywane w lokalnej bazie danych umieszczonej w katalogu App_Data. Jeżeli dane mają być przechowywane na innym serwerze (ale serwerze SQL Server), to wtedy należy uruchomić narzędzie aspnet_regsql do jego skonfigurowania i dokonać odpowiednich wpisów w pliku web.config 5
Autentykacja Forms Windows 6
[Authorize] public ActionResult Edit(int id) [Authorize(Users="Admin, Editor")] public ActionResult Edit(int id) Uwaga! Tylko ASP.NET [Authorize(Roles="Administrators")] public ActionResult Edit(int id) 7
Membership klasa dostarczająca podstawową obsługę użytkowników. Umożliwia m. in. dodawanie nowego użytkownika, usuwanie użytkownika, modyfikowanie informacji o użytkowniku, generowanie listy użytkowników. MembershipUser klasa dostarczająca podstawowych informacji na temat konkretnego użytkownika. Umożliwia m.in. zmianę hasła, określenie czy użytkownik jest aktualnie zalogowany, kiedy użytkownik ostatni raz się logował. MembershipProvider klasa abstrakcyjna definiująca funkcjonalność dla źródła danych (data providers), które ma być wykorzystane z mechanizmem Memberships. Personalizacja dostosowywanie wyglądu strony internetowej w zależności od zalogowanego użytkownika, dostarczonych przez niego informacji lub historii jego aktywności na stronie. Mechanizm ASP.NET Profiles umożliwia przechowywanie i dostęp do dodatkowych informacji o użytkowniku. Routing Trasa jest wzorcem URL mapowanym na odpowiedni uchwyt, którym może być: fizyczny plik na dysku klasa, która może przetworzyć żądanie 8
Wzorce URL składają się z segmentów rozdzielonych znakiem slash. Każdy segment może zawierać stałe znakowe jak również zmienne, przy czym zmienne muszą być objęte nawiasami klamrowymi /Produkty/kategoria_produktow /Faktury/Rok/Miesiac/Dzien /Artykuly/Rok-Miesiac-Dzien DEMO controller/action/id controller.mvc/action/id Każdej zmiennej we wzorcu URL można przypisać wartość domyślną, która będzie wykorzystana w przypadku, gdy nie podamy jej wartości. controller/action/id / controller = "Home" (wartość domyślna), action = "Index" (wartość domyślna) /Osoba/ controller = "Osoba", action = "Index" (wartość domyślna) /Osoba/Edit/5 controller = "Osoba", action = "Edit" id = 5 Trasy są wybierane w kolejności dodawania. Tzn. wybrana będzie pierwsza pasująca trasa. 9
Pozwalają na określenie jakie wartości mogą przyjmować zmienne. Jeżeli adres URL zawiera wartości, które są poza zakresem taka trasa jest ignorowana. Ograniczenia mogą być definiowane jako: wyrażenie regularne (string) obiekty implementujące interfejs IRouteConstraint public interface IRouteConstraint bool Match( HttpContextBase httpcontext, Route route, string parametername, RouteValueDictionary values, RouteDirection routedirection ) Adresy URL : powinny być proste i jasne powinny być krótkie powinny zawierać podkreślenie "_" zamiast spacji (%20) powinny być "hackowalne" przez użytkownika nie powinny zawierać identyfikatorów bazy danych powinny wspierać "niejednoznaczność" Jeżeli pierwsze żądanie dla aplikacji wykonaj zawartość pliku global.asax Wykonanie routingu (UrlRoutingModule) Stworzenie uchwytu żądania MVC Stworzenie kontrolera (DefaultControllerFactory) Wywołanie metody Execute Wywołanie akcji (ControllerActionInvoker) Przetworzenie wyniku 10
public interface IRouteHandler IHttpHandler GetHttpHandler( RequestContext requestcontext ) public IHttpHandler GetHttpHandler( RequestContext requestcontext) var routedata = requestcontext.routedata; routedata.values["action"] += "ByName"; return new MvcHandler(requestContext); routes.add( "ByName", new Route( "Kontakty/Name/action", new RouteValueDictionary( new controller = "Osoba", action = "Display" ), new Additions.ChangeActionNameHandler() ) ); 11