Niechciana walidacja pól w ASP.NET MVC4

0

Cześć, mój pierwszy post, więc proszę o wyrozumiałość. Uczę się ASP.NET MVC4. Przeszedłem do walidacji pól i mam problem.

  1. Stworzyłem klasę, która zawiera jakieś tam pierdoły typu: idU, nick, imię, nazwisko, data urodzenia, hasło, email, ilość czegoś tam.
    Chciałem, żeby obowiązkowe było jedynie pole nick, hasło oraz adres email. Dodałem przed nimi:
[Required(ErrorMessage = "Nick jest wymagany")]
[Required(ErrorMessage = "Hasło jest wymagane")]
[Required(ErrorMessage = "Adres email jest wymagany")]
  1. W kontrolerze napisałem jakąś tam metodę dodającą usera do bazy

  2. Wygenerowałem widok.

Moje problemy:

  • pierwsze pole "idU" nie jest uwzględnione w widoku - nie ważne, że to jest mi akurat do niczego potrzebne, mógłby zamiast tego być telefon. Po prostu nie mam pojęcia dlaczego się do pole nie pojawiło w widoku... niczym nie różniące się od pozostałych. Tym bardziej, że robię to tylko do nauki.

Szukając w Internecie czegoś na ten temat, natknąłem się na:

http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

Tam również się pole ID komuś nie pojawiło - dlaczego? Oczywiście mogę dodać je ręcznie, ale jako, że nie wiem skąd to się wzięło, to nie wiem czy następnie mi pole np. 6 ze 180 nie zniknie, którego nie zauważę :/

  • Oprócz tych pól, które oznaczyłem jako obowiązkowe poprzez Required, walidowane są też inne, które nie chce aby były obowiązkowe. Chodzi o wszystkie pola, które nie są stringami (np. data urodzenia, id, ilość włosów na głowie...). Co zrobić, aby te pola mogły pozostać puste? Czy to normalne zachowanie?
1

MVC dużo rzeczy robi automagicznie, w celu ułatwienia pracy programiście. Akurat pole Id jest o tyle specyficzne, że może nie być generowane w widoku - średnio aby użytkownik sam sobie Id w bazie nadawał (przynajmniej tak przypuszczam, że to jest powodem). Co do pozostałych pól - to jak sam napisałeś, że wszystkie mają walidację, oprócz tych które nie są stringami. Poczytaj o typach wartościowych w C# oraz klasie Nullable, spróbuj też zrobić w kodzie coś takiego:
DateTime dt = null i skompilować. Następnie zmień DateTime na DateTime? i zobacz, czy przejdzie.

0

Dzięki, sposób z postawieniem znaku zapytania przy typie rzeczywiście pozwala na przypisanie wartości null i wtedy pole nie jest validowane. Jeśli jednak dobrze pamiętam, to teraz nie mogę wykonać podstawienia mojej daty (tej ze znakiem zapytania, która może zawierać null) do innego typu DateTime, więc rozwiązanie dla mnie średnie... chyba, że to w ten sposób się właśnie rozwiązuje. Przecież niemożliwe, żeby w ASP.NET nie można było dać pola z datą nieobowiązkowego bez żadnych tricków. :P

@Edit
Tak myślę, że to podstawienie akurat potrzebne mi nie będzie, napisałem to tak bez zastanowienia. Jeśli jednak istnieje jakiś inny sposób, to dajcie znać.

Wracając do tego ID, to jeszcze sprawdzę - pewnie masz również rację i będę po prostu pilnował, czy jakieś pole mojej klasy nie zawiera w sobie "id".

1

Jeśli jednak dobrze pamiętam, to teraz nie mogę wykonać podstawienia mojej daty (tej ze znakiem zapytania, która może zawierać null) do innego typu DateTime, więc rozwiązanie dla mnie średnie

Eee...?? C# to nie Java, gdzie int jest "niekompatybilny" z Integer - tutaj projektanci, jednak trochę bardziej się wykazali. Zamiast strzelać, co można zrobić, co nie proponuję szybką lekturę chociażby tego: http://www.cezarywalenciuk.pl/post/2011/06/10/Kurs-Obiektowosc-w-C-Wartosci-Null-i-typy-Nullable-04.aspx

0

Co do Id to potrzebujesz je tylko w edycji jako @html.HiddenFor(model=>model.Id) po to, aby było wiadomo, jaki element edytujesz.
W widoku Create nie potrzebujesz Id, gdyż tworzy się ono w bazie automatycznie po wysłaniu formularza.

Tak na marginesie proponuję używać data annotations [Key],
przykładowo:
[Key]
public int IdAktualnosc { get; set; }

dzięki temu możesz używać dowolnych nazw dla id.

Natomiast jeżeli chodzi o daty to istnieje możliwość zapisu daty null-owanej.
tak to wygląda widoku edycji, bo w takim będziesz potrzebował takiej linijki, w create możesz dać normalnie wygenerowany model i zapisze się bez problemu.

            @Html.TextBoxFor(model => model.NazwaPolaZData, Model.NazwaPolaZData.HasValue ? Model.NazwaPolaZData.Value.ToString("yyyy/MM/dd") : string.Empty, new { @class = "datepicker" })

do obsługi daty z poziomu formularza proponuję wtyczkę jQuery datepicker.

pozdro!

1 użytkowników online, w tym zalogowanych: 0, gości: 1