6

Necesito mostrar el formulario de registro y el formulario de inicio de sesión en la página de inicio.ASP .Net MVC 3: Acción y redirección infantil

Si la validación falla en estos dos formularios, necesito mostrar los errores adecuados en la página de inicio.

Pero si no hubo ningún error, el usuario debe ser redirigido al Tablero seguro.

Para lograr esto, estoy usando child action en la página principal de esta manera:

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

que funcione a la perfección como se espera si hay algún error, ya que es capaz de re-render la partial view con el buen model que tiene validation state información.

Pero si no hubo error, cuando se intenta redirigir, que arroja un error que indica que:

Child actions are not allowed to perform redirect actions. 

¿Hay alguna forma de evitar esto? Estoy seguro de que hay una forma de poner los formularios de registro y de inicio de sesión en la página de inicio. Lo más probable es que no lo sé ya que soy bastante nuevo en ASP .Net MVC.

¿Podría indicarme la dirección correcta aquí?

Respuesta

6

una forma de hacer esto es utilizar formas ajax para los bits de inicio de sesión y registro y, en lugar de devolver un RedirectResult cuando la presentación es válida, devolver parte json que un poco de La secuencia de comandos del lado del cliente tendrá cuidado y se utilizará para hacer un redireccionamiento para usted.

Aquí hay un ejemplo simplificado.

controlador:

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); 
      } 
     } 
    } 
} 

Principal vista 'Índice':

@{ 
    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> 

Registro de forma vista parcial 'Registro':

@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

No debe usar las acciones secundarias en ese contexto.

Una solución a su problema podría ser colocar dos formularios en su página uno para el registro y uno para iniciar sesión. El formulario de registro se publica en una acción de registro en un controlador de membresía, la acción de inicio de sesión se registra en una acción de inicio de sesión en el controlador de membresía.

En caso de que se produzca un error en una de las acciones que puede:

  • muestran una página de entrada/registro y uso del modelo/validación dedicados resultados para mostrar mensajes de error
  • redirección a la URL/Acción de la usuario venía y mostrar un mensaje de error que ha depositado en TempData
1

Sin utilizar javascript para redirección: Si pone formas dentro de usted r vistas secundarias, a veces, si especifica el nombre de la acción y el nombre del controlador en Beginform helper (dentro de la vista secundaria), este problema no ocurre.por ejemplo, he cambiado mi punto de vista la acción niño como éste:

Antes:

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

Después:

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

Ahora, Usted puede poner orden RedirectAction dentro de la acción "InsertComment" y todo va a trabajar.


Dos gestión en forma de una página:

nombre 1.Specify para el botón (Cada forma) Presentar (Ej: "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.Haga doble acción para estos formularios. (Ej: "Registro" y "Login")

[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 
       } 
       ... 
      } 
  • Si hace clic en el registro o el botón de inicio de sesión en formas, tanto de las acciones son los llamados pero con "if" determinamos whichone es nuestro objetivo .
Cuestiones relacionadas