Walidacja danych w ASP.NET MVC

Transkrypt

Walidacja danych w ASP.NET MVC
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