2016-10-16 6 views
2

Я разрабатываю свой первый веб-сайт MVC5, и это происходит, когда я впервые использую ET.Правильное использование созданных классов структуры объектов (первый подход DB)

Я использую базу данных Первый подход.

Например, скажем, что это мои поля в таблице Users.

| Username | Email | Password | 

И Entity Каркасы генерировать мне следующий класс:

class Users 
{ 
    public string Username { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
} 

Теперь давайте говорить, что я хочу, чтобы создать представление для регистрации. Эта регистрация требует, чтобы пользователь подтвердил свой пароль. Расширить ли я существующий класс, сгенерированный ET?

class Users 
{ 
    public string Username { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public string ConfirmPassword { get; set; } 
} 

Или я сам создаю совершенно другой класс, который будет содержать всю необходимую информацию отдельно от генерируемого ET класса?

Выполняю ли я просмотр с использованием классов, сгенерированных ET, или я использую собственные классы?

Я видел, что ViewModels упоминаются здесь и там, но мне не очень понятно, с какой целью они служат.

На данный момент я вручную добавляю дополнительные поля в классы ET, и это работает, но я понятия не имею, что я делаю это неправильно или правильно.

+0

Почему вы хотите добавить новую заявку для подтверждения пароля, вы можете сравнить значение двух текстовых полей на представлении. –

+0

Сравнить на контроллере POST? На чем-то вроде WebForms я бы сравнил два значения TextBoxe, не уверен, как это происходит на MVC. – OverflowStack

+1

Вы можете создать 'RegisterViewModel'.Затем, чтобы сравнить эти свойства, используйте атрибут «Compare», точно так же, как и то, что используется в шаблоне проекта ASP.NET MVC по умолчанию. –

ответ

4

Вы не должны касаться созданного кода фрейма сущности для такого требования. Вместо этого вам нужно создать модель представления, чтобы содержать поля, которые вы хотите получить от пользователя при регистрации. Вы можете создать RegisterViewModel. Затем, чтобы сравнить эти свойства, используйте атрибут Compare, точно , как то, что используется в шаблоне проекта MVC по умолчанию ASP.NET. Затем контроллер, проверьте модель состояние действительно, создать User объект, используя размещенные значения сохранить в БД:

Модель

public class RegisterViewModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [StringLength(100, 
    ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", 
    ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
} 

действий

// POST: /Account/Register 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Register(RegisterViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new User() { UserName = model.UserName, /*... other fields */ }; 
     // Save user 
    } 

    // If we got this far, something failed, redisplay form 
    return View(model); 
} 
+0

Спасибо. И представление реестра будет «сгенерировано» с использованием класса RegisterViewModel в качестве шаблона или класса пользователей ET? – OverflowStack

+0

Да, в этой строке 'var user = new User() {UserName = model.UserName,/* ... другие поля * /};' –

+0

Опубликованный код основан только на шаблоне кода проекта ASP.NET, сгенерированном кодом, и вам может потребоваться внести некоторые изменения в соответствии с вашими требованиями. Но это хороший примерный код, чтобы поделиться идеей с вами и показать вам правильный путь. –

0

Не расширяйте объекты EF. Создавайте новые классы, и когда вам нужно перенести данные из БД в представление, скопируйте свойства (вы можете использовать AutoMapper).

0

Когда речь идет о к первому подходу к базе данных, вы никогда не должны пытаться расширить свою модель, потому что это может вызвать все виды странного поведения.

Одно из таких действий, с которыми вы столкнетесь при попытке обновить свою модель из базы данных, автоматически удалит добавленные вами вручную.

Я бы порекомендовал вам пойти на ViewModel Пример, упомянутый в ответах.

Смежные вопросы