Ниже мой класс модели для пользователя,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);
Пожалуйста, помогите.
Запустите новый проект MVC Internet - он включает в себя модель/просмотр/код контроллера для управления учетными записями. Посмотрите, как это делает MS. –
Я проверил реализацию, но тем, что они использовали встроенный механизм аутентификации, который может иметь внутреннюю базу данных, в моем случае я настроил таблицу пользователя в базе данных. Проверьте обновленный вопрос. –
Если вы используете разные модели представлений, тогда да, нужно иметь метод конвертации в обоих (некоторые из них помещают его в модель как Save (User u)). В качестве опции вы можете попробовать AutoMapper (также накладные расходы памяти, но invisibe :). Если вы извлекаете модели, вы можете использовать переопределение метода Save(). – LINQ2Vodka