2015-04-14 2 views
1

У меня есть один вид, и этот вид содержит создание пользовательских и входных форм. Для обоих у меня разные модели. Когда пользователь нажимает кнопку «Регистр», я передам значения модели регистров и для входа в систему клика я передаю логические значения модели. Я также добавил некоторую валидацию в модели (вы можете увидеть ее в моем коде ниже). Поскольку у меня есть две модели, я добавил еще одну модель (Учетная запись), которая содержит обе модели. Передача этой модели (Учетная запись) из представления в контроллер при щелчке регистра или входа в систему. Причина, по которой модель недействительна все время когда пользователь нажимает на кнопку входа в систему am, пропуская модель учетной записи, которая имеет как регистрационную, так и лог-модель, но с данными только в журнале. Все значения для модели регистров будут пустыми, поскольку пользователь нажал на вход в систему (только данные для входа будут там). Таким образом, в контроллере Model.Is valid всегда false, так как для модели регистров не существует значений.Ошибка Model.Isvalid в моем приложении MVC 4. Как это исправить?

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

@model Selfie.Models.Account 
    @using (Html.BeginForm())  
     { 

        @Html.TextBoxFor(model => model.RegisterModel.FirstName,null, new {@class="form-control",id="fn", placeholder=" First Name",required="true",maxlength="20"}) 
        @Html.ValidationMessageFor(model => model.RegisterModel.FirstName) 

        @Html.TextBoxFor(model => model.RegisterModel.LastName,null, new { @class = "form-control",id="ln", placeholder=" Last Name",required="true",maxlength="20"}) 
        @Html.ValidationMessageFor(model => model.RegisterModel.LastName) 

        <button type="submit" class="btn btn-success" id="btnsub">Create Account</button>   


     } 
//Login 
@using (Html.BeginForm("Login", "Selfie", FormMethod.Post, new { })) 
     { 


        @Html.TextBoxFor(model => model.LoginModel.UserName,null, new { @class = "form-control",id="lem"}) 
        @Html.ValidationMessageFor(model => model.LoginModel.UserName) 

        @Html.TextBoxFor(model => model.LoginModel.Pwd,null, new { @class = "form-control"}) 
        @Html.ValidationMessageFor(model => model.LoginModel.Pwd) 

        <button type="submit" class="btn btn-success" id="btnlogin">Log In</button> 

     }  

// Контроллер

[HttpPost]

public ActionResult Register(Account registration) 
    { 
     if(Model.Isvalid) 
      { 
       string a= Account.fname; 

      } 
    } 

    [HttpPost] 
    public ActionResult Login(Accountlogin) 
    { 

     if(Model.Isvalid) 
      { 
       string a= Account.username; 

      } 
    } 

Модель

[Required(ErrorMessage="Last name is required")] 
    public string LastName {get; set;} 
    [Required(ErrorMessage="First name is required")] 
    public string FirstName { get; set; } 

} 

public class LoginModel 
{ 
    [Required(ErrorMessage = "User name is required")] 
    [Display(Name = "User name")] 
    [RegularExpression("^([\\w\\.\\-]+)@([\\w\\-]+)((\\.(\\w){2,3})+)$", ErrorMessage = "Invalid email")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Password is required")] 
    public string Pwd { get; set; } 
} 
public class Account 
    { 
     public LoginModel LoginModel{get; set;} 
     public RegistrationModel RegisterModel {get; set;} 
    } 
+3

'Register()' и 'Login()' - 2 разных метода (и 'Register()' является отключенным никогда не повторяющимся действием). Почему они в одной форме? –

+0

Группы проверки? https://msdn.microsoft.com/en-us/library/ms227424%28v=vs.140%29.aspx –

+0

@SamiKuhmonen Это только веб-формы, я боюсь. – mattytommo

ответ

2

Ну, первое, что первое, как Стивен упомянул в комментариях, эти два не должны действительно находиться в той же форме.

Однако, я сталкивался с той же проблемой в прошлом в отношении проверки только частей модели (в ситуациях, когда ваши модели и объекты реализуют один и тот же интерфейс, иногда бывает нецелесообразно проверять все).

Я обошел это, выполнив следующее, вы только проверяете поля, которые передаются из формы. Таким образом, в ваших действиях вы бы сделали:

var itemsToIgnore = ModelState.Keys 
    .Where(c => !Request.Form.AllKeys.Contains(c)) 
    .ToList(); 

foreach (var item in itemsToIgnore) 
{ 
    ModelState.Remove(item); 
} 

if (ModelState.IsValid) 
{ 
    //all fields passed in were valid 
} 
+0

Я взволнован, если он работает, что является логикой отфильтрованной переменной 'itemsToIgnore'? –

+0

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

+0

Я спрашивал о логике этого '.Contains (c)' filter. Как он фильтрует поля, которые передаются из формы? –

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