6

Мне нужно отобразить регистрационную форму и форму для входа на домашней странице.ASP .Net MVC 3: Резервное действие и перенаправление детей

Если валидация не выполняется в этих двух формах, мне нужно отобразить правильные ошибки на главной странице.

Но если не было ошибок, пользователь должен быть перенаправлен на защищенную панель мониторинга.

Для этого я использую child action на домашней странице, как это:

@Html.Action("Register", "Membership") 

Он работает отлично, как и ожидалось, если есть какие-либо ошибки, так как она способна re-renderpartial view с надлежащим model что имеет validation state информация.

Но если бы не было никакой ошибки, когда он пытается перенаправить, он выдает ошибку о том, что:

Child actions are not allowed to perform redirect actions. 

Есть ли способ обойти это? Я уверен, что есть способ разместить формы регистрации и регистрации на главной странице. Скорее всего, я не знаю, так как я новичок в ASP .Net MVC.

Не могли бы вы указать мне в правильном направлении здесь?

ответ

6

Один из способов сделать это является использование Ajax формы для входа в систему и регистрации битов и, вместо возвращения RedirectResult, когда подача действительно, вернуть часть json, который немного клиентский скрипт будет отслеживать и использовать для вас перенаправление.

Вот упрощенный пример.

Контроллер:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.ComponentModel.DataAnnotations; 
using MvcApplication12.Models; 

namespace MvcApplication12.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Register() 
     { 
      return PartialView(new UserDetails()); 
     } 

     [HttpPost] 
     public ActionResult Register(UserDetails details) 
     { 
      if (ModelState.IsValid) 
      { 
       return Json(new {redirect = true, url = Url.Action("Index","Dashboard")}); 
      } 
      else 
      { 
       return PartialView(details); 
      } 
     } 
    } 
} 

Главная страница 'Индекс' Вид:

@{ 
    ViewBag.Title = "Index"; 
} 
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    function checkForRedirect(data) 
    { 
     if (data.redirect && data.url) 
     { 
      location.href = data.url; 
     } 
    } 
</script> 

<p>Home page stuff.....</p> 

<div id="RegistrationArea"> 
    @Html.Action("Register") 
</div> 

<p> Home page stuff.....</p> 

Регистрационная форма частичный вид 'Register':

@model MvcApplication12.Models.UserDetails 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Ajax.BeginForm(new AjaxOptions() 
{ 
    HttpMethod = "POST", 
    Url = Url.Action("Register", "Home"), 
    OnSuccess = "checkForRedirect(data)", 
    UpdateTargetId = "RegistrationArea", 
    InsertionMode = InsertionMode.Replace 
})) 
{ 
    @Html.LabelFor(m => m.UserName) 
    @Html.EditorFor(m => m.UserName) 
    @Html.ValidationMessageFor(m => m.UserName) 

    @Html.LabelFor(m => m.Password) 
    @Html.EditorFor(m => m.Password) 
    @Html.ValidationMessageFor(m => m.Password) 

    <input type="submit" /> 
} 
2

Вы не должны использовать дочерние действия в этом контексте.

Решение проблемы может состоять из . Поместите две формы на свою страницу одну для регистрации и одну для входа. Регистрационная форма отправляется в действие «Реестр» в контроллере членства, а также в действиях входа в действие «Вход» в контроллере Membership.

В случае возникновения ошибки в одном из действий, которые вы можете:

  • Покажите выделенные Вход/Регистрация страниц и использование модели/проверки результатов, чтобы показать сообщения об ошибках
  • редирект на URL/Действие пользователь исходит от и показать сообщение об ошибке вы размещаете в TempData
1

Без использования JavaScript для редиректа: Если вы ставите формы внутри себя r child views. Иногда, если вы указываете имя действия и имя контроллера в помощнике Beginform (внутри дочернего представления), эта проблема не возникает.например, я изменил свой ребенок вид действий, как это:

До:

@using (Html.BeginForm()) 
{ 
... 
} 

После:

@using (Html.BeginForm("InsertComment", "Comments", FormMethod.Post, new { id = "commentform" })) 
{ 
... 
} 

Теперь Вы можете поместить команду RedirectAction в действие "InsertComment" и все будет работать.


Два управления формы на одной странице:

имя 1.Specify для кнопки (Каждая форма) Отправить (Пример: "submitvalue")

form1:

<input type="submit" value="login" name="submitValue" class="btn btn-success pull-right" /> 

form2:

<input type="submit" value="register" name="submitValue" class="btn btn-success pull-right" /> 

2. Сделайте два действия для этих форм. (Пример: «Регистрация» и «Логин»)

[HttpPost] 
    public ActionResult Login(LoginVM model, string submitValue) 
      { 
       if (submitValue == "login") 
       { 
       //Do Something 
       } 
       ... 
      } 


[HttpPost] 
public ActionResult Register(RegisterVM model, string submitValue) 
      { 
       if (submitValue == "register") 
       { 
       //Do Something 
       } 
       ... 
      } 
  • Если нажать на регистр или кнопку для входа в формах, оба действия называются, но с «если» заявление мы определяем whichone наша цель ,