2013-11-09 5 views
1

Ниже мой класс модели для пользователя,mvc4 объявляя модель класса - дилемма

public class User 
{ 
    [System.ComponentModel.DataAnnotations.Key] 
    public int UserId { get; set; } 
    public Int16 RoleID { get; set; } 
    [DisplayName("First Name :")] 
    public string FirstName { get; set; } 
    [DisplayName("Last Name :")] 
    public string LastName { get; set; } 

    [DisplayName("Email :")] 
    [Required(ErrorMessage = "Email is required")] 
    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    public string Email { get; set; } 

    [DataType(DataType.Password)] 
    [Required(ErrorMessage = "Password is required")] 
    [DisplayName("Password :")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Compare("Password")] 
    [Required(ErrorMessage = "Confirm password is required")] 
    [DisplayName("Confirm Password :")] 
    public string CPassword { get; set; } 
} 

После кода в AccountController

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(User model, string returnUrl) 
{ 
     if(ModelState.IsValid) //This turns out to be always false 
} 

Это идет в Login.cshtml

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 
<fieldset class="cf addForm"> 
    @Html.LabelFor(model => model.Email) 
    @Html.TextBoxFor(model => model.Email, new { @class = "wd293 inputtext" }) 
    @Html.ValidationMessageFor(model => model.Email) 
    @Html.LabelFor(model => model.Password) 
    @Html.PasswordFor(model => model.Password, new { @class = "wd293 inputtext" }) 
    @Html.ValidationMessageFor(model => model.Password) 
    <div class="cf signBtn"> 
     <input type="submit" value="Sign in" class="pageBtn alignleft savebtn" /> 
    </div> 
</fieldset> 
} 

Выше класс модели должен отлично работать для формы Регистра, то есть там, где требуются все детали, как указано, например, Email/Password/ConfirmPassword

Но для формы входа, где требуется только поле «Имя и пароль», поэтому в этом случае ModelState.IsValid всегда дает false.

Я в дилемме, каково должно быть решение, создать еще один класс модели? например, для формы входа в систему будет еще одна модель UserLoginViewModel, которая будет иметь только 2 свойства электронной почты/пароль и для формы регистра UserRegisterViewModel, которая будет иметь все необходимые свойства?

Прошу вас, если это звучит глупо, поскольку я довольно новичок в MVC4. Пожалуйста, дайте мне знать, нужен ли дальнейший код.

EDIT

public class MyDBContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Category> Categories { get; set; } // It has CategoryID,CategoryName properties 
} 

Выше мой дб контекст класса для сохранения категории в базе данных я пишу следующий код,

new MyDBContext().Categories.Add(category); 

Так скажем, я создал новый класс UserRegisterViewModel со всеми атрибут, необходимый для формы регистра, в этом случае мне нужно снова преобразовать этот UserRegisterViewModel в User, будет ли это хорошо или будет добавляться накладные расходы памяти?

Конверсия будет как

User newUser = new User(); //Assign all the properties from UserRegisterViewModel to this and save 
new MyDBContext().Users.Add(newUser); 

Пожалуйста, помогите.

+1

Запустите новый проект MVC Internet - он включает в себя модель/просмотр/код контроллера для управления учетными записями. Посмотрите, как это делает MS. –

+0

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

+0

Если вы используете разные модели представлений, тогда да, нужно иметь метод конвертации в обоих (некоторые из них помещают его в модель как Save (User u)). В качестве опции вы можете попробовать AutoMapper (также накладные расходы памяти, но invisibe :). Если вы извлекаете модели, вы можете использовать переопределение метода Save(). – LINQ2Vodka

ответ

2

В этом случае у вас должен быть один класс для каждого вида. Если вы создаете проект MVC из шаблона интернета в Visual Studio, эти классы/модели генерируются по умолчанию. Вы можете использовать наследование, если хотите. Тем не менее, есть несколько возможностей избежать нескольких моделей, но я думаю, что чище и быстрее иметь одну модель для каждого вида.

+0

Я обновил свой вопрос в соответствии с вашим предложением, пожалуйста, помогите. –

0

Попробуйте \ удалить необходимый атрибут поля от адреса электронной почты

[EmailAddress(ErrorMessage = "Invalid Email Address")] 

попробуете это, он будет работать или нет? Теперь ваша модель действительна?

+0

Электронная почта является обязательным полем, поэтому не удается удалить этот атрибут. –

+0

уверен, но сначала вы должны определить, где проблема, не так ли? – Besher

0

Оказывается, как мы можем подтвердить определенное свойство и проверить ModelState со следующим кодом, а также,

//Instead of this - which checks all attributes of model class 
if (ModelState.IsValid) 

Измененный к этому

//This will only verify against email/password property only so other property are ignored 
if (ModelState.IsValidField("Email") && ModelState.IsValidField("Password")) 

Изменение кода авторизации с выше, и его работал.

Благодарим вас за поддержку.

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