ASP.NET MVC kilka pytan

0

czesc,

ucze sie technologii MVC z wykorzystaniem asp.net i c#.
niestety nie idzie mi to tak latwo i mam kilka pytan.
To co robie to formularz, uzytkownik wchodzi na strone, loguje sie badz rejestruje (mail + haslo) i wypelnia formularz.
Pytanie 1.:
Sprawdzanie czy uzytkownik jest juz w bazie danych powinno sie odbywac w Kontrolerze czy Modelu ?
Pytanie 2.:
Jak zrobic, zeby formularz byl dostepny tylko dla uzytkownika zalogowanego?
Pytanie 3.:
W wielu tutorialach, jest pokazane jak zrobic taki formularz, ale wszedzie robia w Modelu klasu User, potem z niej korzystaja, jak to ominac i korzystac tylko z gotowej bazy danych?
Pytanie 4.:
Jak powinienem przekazywac zmienne z formularza do kontrolera i odwrotnie?

0
  1. Piszesz swój własny provider? Jeśli korzystasz z tego wbudowanego, nie musisz już sprawdzać takich rzeczy. W przeciwnym razie umieściłbym to w osobnym miejscu (np. stwórz katalog Membership).
  2. Atrybut [Authorize]
  3. I bardzo dobrze robią. Chcesz bezpośrednio w widoku podpinać się pod bazę? Da się to zrobić, ale to fatalne rozwiązanie. Na tym polega całe MVC, żeby izolować warstwy; dzięki temu możesz robić testy jednostkowe, możesz szybko i bezboleśnie modyfikować jedną warstwę nie ruszając innych.
  4. Z kontrolera do widoku przez ViewModel (czyli to, co deklarujesz zwykle na początku pliku cshtml jako @model). Możesz też użyć ViewBaga lub ViewData, ale jest to generalnie niezalecane. Z widoku do kontrolera? Nie bardzo wiem, co masz na myśli. Jedyne co mi przychodzi do głowy, to wywoływanie jakichś akcji kontrolera w widoku (np. partial view), wtedy przekazujesz normalnie parametr do metody.
0

Ad 1: z tego wbudowanego czyli jakiego? Mam napisane to i dziala tylko nie wiem po prostu czy mam to w dobrym miejscu, kod wyglada tak:

 public ActionResult Register(string login, string password)
{
    var query = (from c in context.Users
        where (c.Login == login && c.Password == password)
        select c).Count();
    if (query != 0)
        return View("../Main/ErrorUserExist");

    try
    {
        var a = new User() { Login = login, Password = password };
        context.Users.Add(a);
        context.SaveChanges();

        return View("../Main/Success");
    }
    catch (Exception asd)
    {
        return View("../Main/Failure");
    }               
}
 

Obecnie jest to w kontrolerze, a wydaje mi sie ze powinno byc w Modelu. Tylko nie wiem wtedy dwoch rzeczy: a)jak sie przesyla dane z View do Modelu, oraz jak wywolac potem View z modelu.
Nie podoba mi sie takze takie wywolanie: return View("../Main/Failure"); uwazam ze powinno sie to jakos inaczej robic.

Ad2.
Okay, a jak potem zaladowac pytania od 1 do 10 dla uzytkownika AAAA, a dla uzytkownika BBBB zaladowac np. od 5 do 10 pytania?

Ad3.
W takim razie, majac gotowa baze danych, jak powinien wygladac proces ladowania do niej danych? Czy to co mam w punkcie 1 zrobione jest zlym rozwiazaniem? Oprocz gotowej bazy danych potrzebuje miec tez jej odpowiedniki w klasie? Uzywam Entity Framework-a.

Ad4.
Czy mozesz mi dac jakis przyklad? Np. kod zrodlowy takie czegos: po kliknieciu na button, zawartosc textboxa jest czytana w kontrolerze (albo modelu bo nie wiem gdzie to ma byc czytane). Obecnie robie to tak:

@using (Html.BeginForm("Register", "Main"))
{ 
    <ol>
        <li>
            @Html.Label("Login")
            @Html.TextBox("login")
        </li>
        <li>
            @Html.Label("Pass")
            @Html.TextBox("password")
        </li>

    </ol>
    <button name="button" value="login">Register</button>
 

dobrze?

Pytanie 5:
Chce miec dwa buttony: login i register. Czy mam miec dwa rozne widoki czy wystarczy mi jeden i bede tylko zmienial to co sie wyswietla?

1

Ad. 1.
Pomijając niebezpieczeństwo przechowywania hasła w bazie jako czysty tekst, to rozumiem, że jeśli podam taki sam login, ale inne hasło, to będę mógł się zarejestrować?

Opis wbudowanego Membership Providera: http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx
Wbudowany pracuje na bazie danych, która ma wymyśloną przez Microsoft strukturę. Ja wolę napisać customowe membership i role providery, tak aby korzystały z mojej bazy danych. Potem ustawiam je w web.config jako mechanizm używany w aplikacji, a następnie logując użytkownika za pomocą metody Membership.ValidateUser aplikacja wie, że użytkownik jest zalogowany. Dzięki temu działa np. oznaczenie jakiegoś kontrolera/akcji takim atrybutem: [Authorize(Roles = "Admin")]

Ad. 2.
Odpowiednio wczytać z bazy.

Ad. 3.
Jeśli korzystasz z ORM, to musisz mieć i klasy w programie, i tabele w bazie danych.

Ad. 4.
Jak Ty chcesz w Modelu czytać coś z Widoku? Model nic o Widoku ma nie wiedzieć. To Kontroler pobiera dane z Widoku, i decyduje co z nimi zrobić, np. wywołać jakąś metodę z Modelu.

Ad. 5.
Dwa widoki.

Zadajesz elementarne pytania i chyba oczekujesz, że włożymy Ci wiedzę do głowy. Jakbyś przerobił jakikolwiek tutorial o MVC, to byś to wszystko wiedział. Zapraszam tutaj: http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-1

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