2013-02-24 3 views
2

У меня есть страница индекса, которая имеет два частичного вида _Register и _Login. У меня есть три модели просмотра: LoginViewModel, RegisterViewModel, LoginOrRegisterViewModel. Теперь я хочу, чтобы, если modelstate недействителен, я хочу перенаправить обратно на страницу индекса, имеющую как регистрационную форму, так и регистрационную форму. Но здесь он перенаправляет на просмотр регистра или логина с проверкой в ​​другой viewmodel.Пожалуйста, направляйте меня относительно правильного тип возврата и правильный вид.Ошибка проверки в обоих частичных представлениях

Index.cshtml

@model Project.ViewModels.LoginOrRegisterModel 
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
    @Html.Partial("_Register", Model.Registermodel) 
    @Html.Partial("_Login", Model.Loginmodel) 

_Register.cshtml

@model ProjectHub.ViewModels.RegisterModel 

@using (Html.BeginForm("Register", "account", FormMethod.Post)) 
{ 
    <div class="label">@Html.Label("Name")</div> 
    <div class="field">@Html.TextBoxFor(m => m.FullName)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.FullName)</div> 


    //similar html for other attributes 

    <input class="field" id="submit" type="submit" value="Sign Up" /> 
    @Html.ValidationSummary() 
} 

_Login.cshtml

@model ProjectHub.ViewModels.LoginModel 
@using (Html.BeginForm("Login", "account", FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 
    <div class="label">@Html.Label("Username")</div> 
    <div class="field">@Html.TextBoxFor(m => m.Username)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Username)</div> 

    <div class="label">@Html.Label("Password")</div> 
    <div class="field">@Html.PasswordFor(m => m.Password)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Password)</div> 

    <input class="field" id="submit" type="submit" value="Login" /> 
} 

ViewModels

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace Project.ViewModels 
{ 
    public class LoginModel 
    { 
    [Required(ErrorMessage="Username is Required")] 
    public string Username { get; set; } 
    [Required(ErrorMessage = "Password is Required")] 
    public string Password { get; set; } 
    } 

    public class RegisterModel 
    { 
    [Required(ErrorMessage = "Username is Required")] 
    public string Username { get; set; } 
    [Required(ErrorMessage = "Password is Required")] 
    public string Password { get; set; } 
    [Required(ErrorMessage = "Password is Required")] 
    public string ConfirmPassword { get; set; } 
    [Required(ErrorMessage = "Name is Required")] 
    public string FullName { get; set; } 
    [Required(ErrorMessage = "Email is Required")] 
    public string Email { get; set; } 
    [Required(ErrorMessage = "Country is Required")] 
    public string Country { get; set; } 
    } 

    public class LoginOrRegisterModel 
    { 
     public LoginModel Loginmodel { get; set; } 
     public RegisterModel Registermodel { get; set; } 
    } 
} 

AccountController

public ActionResult Index() 
    { 
     LoginOrRegisterModel model = new LoginOrRegisterModel(); 
     model.Loginmodel = new LoginModel(); 
     model.Registermodel = new RegisterModel(); 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult Index(LoginOrRegisterModel model) 
    { 
     return View(model); 
    } 

    [HttpGet] 
    public ViewResult Login() 
    { 
     LoginModel model = new LoginModel(); 
     return View("_Login",model); 
    } 
    [HttpPost] 
    public ActionResult Login(LoginModel usermodel) 
    { 
      if (ModelState.IsValid) 
      { 
       //some validation loic 
       return RedirectToAction("Index", "Home"); 
      } 
      return View("Index", new LoginOrRegisterModel() { Loginmodel = usermodel, Registermodel = new RegisterModel() }); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Invalid Username/Password"); 
      return View("Index",new LoginOrRegisterModel() { Loginmodel = usermodel, Registermodel = new RegisterModel() }); 
     } 
    } 

    public ViewResult Register() 
    { 
     RegisterModel model = new RegisterModel(); 
     return View("_Register",model); 
    } 
    [HttpPost] 
    public ActionResult Register(RegisterModel usermodel) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View("Index", new LoginOrRegisterModel() { Loginmodel = new LoginModel(), Registermodel = usermodel }); 
     } 
     try 
     { 
      //Some logic for validation 
      return RedirectToAction("activationemail", new { username = usermodel.Username, email = usermodel.Email }); 
     } 
     catch (Exception ae) 
     { 
      return View("Index", new LoginOrRegisterModel() { Loginmodel = new  LoginModel(), Registermodel = usermodel }); 
     } 
    } 

Пожалуйста, помогите мне, я получил ошибку like this

ответ

2
  1. Добавить HtmlFieldPrefix при оказании парциальное:

    @Html.Partial("_Register", Model.Registermodel, new ViewDataDictionary(this.ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Registermodel" } }) 
    @Html.Partial("_Login", Model.Loginmodel, new ViewDataDictionary(this.ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Loginmodel" } }) 
    

    или использовать PartialFor

  2. Добавить в ваш метод действия BindAttrib Ют с префиксом:

    public ActionResult Register([Bind(Prefix = "Registermodel")]RegisterModel usermodel) 
    public ActionResult Login([Bind(Prefix = "Loginmodel")]LoginModel usermodel) 
    
+0

Великий Ответ. Сохранено много моего времени !!! –

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