6

Muszę wyświetlić formularz rejestracyjny i formularz logowania na stronie głównej.ASP .Net MVC 3: Akcja dla dzieci i Przekierowanie

Jeśli sprawdzanie poprawności nie powiedzie się w tych dwóch formularzach, muszę wyświetlić odpowiednie błędy na stronie głównej.

Ale jeśli nie było błędu, użytkownik musi zostać przekierowany do zabezpieczonego pulpitu.

Aby tego dokonać, używam child action na stronie głównej tak:

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

pracować idealnie zgodnie z oczekiwaniami, jeśli są jakieś błędy, jak to jest w stanie re-renderpartial view z właściwym model że ma informacje o validation state.

Ale jeśli nie było żadnego błędu, gdy próbuje przekierować, to generuje błąd informujący, że:

Child actions are not allowed to perform redirect actions. 

jest jakiś sposób obejścia tego? Jestem pewien, że istnieje sposób na umieszczenie formularzy rejestracyjnych i logowania na stronie głównej. Najprawdopodobniej nie wiem, ponieważ jestem całkiem nowy w ASP .Net MVC.

Czy możesz wskazać mi właściwy kierunek tutaj?

Odpowiedz

6

Jednym ze sposobów, aby to zrobić jest użycie formy ajax do logowania i rejestracji bitów i zamiast zwracania RedirectResult gdy złożenie jest ważna, zwrot niektórych json, który trochę skrypt po stronie klienta będzie uważał i używał do wykonania przekierowania.

Oto uproszczony przykład.

Kontroler:

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

strona główna 'Indeks' Widok:

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

Formularz rejestracyjny 'rejestrem' częściowy widok:

@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

Nie należy używać czynności podrzędnych w tym kontekście.

Rozwiązaniem problemu może być umieszczenie dwóch formularzy na stronie pierwszej do rejestracji i jednej do zalogowania. Formularz rejestracyjny publikuje wpisy do akcji rejestru w kontrolerze członkostwa, wpisy akcji logowania do akcji logowania w kontroleru członkostwa.

W przypadku wystąpienia błędu w jednym z działań można:

  • wykazują dedykowane Strona logowania/rejestracji i zastosowanie modelu/walidacji wyników, aby zobaczyć komunikaty o błędach
  • Przekierowanie do adresu URL/działania z użytkownik został pochodzący z i pokazać komunikat o błędzie umieszczenia w TempData
1

Bez użycia JavaScript do przekierowania: Jeśli umieścisz formularze w sobie r widoki podrzędne, Czasami jeśli podasz nazwę akcji i nazwę kontrolera w helperie Beginform (w widoku podrzędnym), problem ten nie występuje.na przykład ja zmieniłem moje dziecko działania widok takiego:

Przed:

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

Po:

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

Teraz można umieścić polecenie RedirectAction wewnątrz "InsertComment" działania i wszystko będzie działać.


Dwa zarządzanie formą w jedną stronę:

nazwa 1.Specify na przycisk (każdy formularz) Zatwierdź (ex: "submitvalue")

form1:

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

formularz2:

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

2. Wykonaj dwie czynności dla tych formularzy. (Ex: „Rejestracja” i „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 
       } 
       ... 
      } 
  • Jeśli klikniesz na rejestru lub przycisk logowania w formach, zarówno działań są nazywane, ale z „if” określamy whichone jest naszym celem .
Powiązane problemy