2011-11-15
Walidacja danych w ASP.NET MVC
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); }
1.
Prosta walidacja
2.
Walidacja z Data Annotation
Właściwości: • IsValid
Metody: • AddModelError(string key, Exception exception) • AddModelError(string key, string errorMessage) • IsValidField(string key)
1
2011-11-15
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);
}
• Range
DEMO
• RegularExpression • Required • StringLength • DataType
2
2011-11-15
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(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(@"(\d{3})-\d{3}-\d{3}")] public string PhoneNumber {set; get;} }
class Person { [Required] [StringLength(50)] public string Name {set; get;} [Range(0, 100)] public int Age {set; get;} [RegularExpression(@"(\d{3})-\d{3}-\d{3}")] public string PhoneNumber {set; get;} }
public ActionResult Create(Person data) { if(ModelState.IsValid) { csi.SaveData(person); return RedirectToAction("index"); } else return View(person); }
3
2011-11-15
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
DEMO
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
2011-11-15
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
2011-11-15
Autentykacja
Forms
Windows
6
2011-11-15
[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
2011-11-15
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ł.
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.
MembershipProvider – klasa abstrakcyjna definiująca funkcjonalność dla źródła danych (data providers), które ma być wykorzystane z mechanizmem Memberships.
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
2011-11-15
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
2011-11-15
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
Adresy URL : • powinny być proste i jasne • powinny być krótkie • powinny zawierać podkreślenie "_" zamiast spacji (%20)
public interface IRouteConstraint { bool Match( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection ) }
Jeżeli pierwsze żądanie dla aplikacji wykonaj zawartość pliku global.asax Wykonanie routingu (UrlRoutingModule) Stworzenie uchwytu żądania MVC Stworzenie kontrolera (DefaultControllerFactory)
• powinny być "hackowalne" przez użytkownika • nie powinny zawierać identyfikatorów bazy danych • powinny wspierać "niejednoznaczność"
Wywołanie metody Execute Wywołanie akcji (ControllerActionInvoker) Przetworzenie wyniku
10
2011-11-15
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