6

홈 페이지에 등록 양식 및 로그인 양식을 표시해야합니다.ASP .Net MVC 3 : 하위 작업 및 리디렉션

두 양식에서 유효성 검사가 실패하면 홈 페이지에 적절한 오류를 표시해야합니다.

그러나 오류가없는 경우 사용자는 보안 대시 보드로 리디렉션되어야합니다.

이를 위해,이 같은 홈 페이지에 child action을 사용하고 있습니다 :

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

re-render 적절한 modelpartial view 할 수있는 것처럼이 오류가 있는지 예상대로 완벽하게 작동하는 validation state 정보가 있습니다.

그러나 오류가 없었다 경우 리디렉션하려고 할 때, 그것은 그라는 오류가 발생합니다 :

Child actions are not allowed to perform redirect actions. 

이 주변에 어떤 방법이 있나요를? 홈페이지에 등록 양식과 로그인 양식을 올리는 방법이 있습니다. 아마 내가 ASP .Net MVC에 대해 매우 익숙하기 때문에 나는 아마 모른다.

여기에 올바른 방향으로 나를 가르쳐 주시겠습니까?

답변

6

한 가지 방법은 당신이 TempData에 배치 오류 메시지가 표시되고 로그인 및 등록 비트에 아약스 양식을 사용하고 있었다 일부를 반환 약간의 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> 

등록 양식을 '등록'부분보기 :

@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

해당 상황에서 하위 작업을 사용하면 안됩니다.

문제의 해결책은 두 페이지를 등록 페이지와 로그인 페이지 두 곳에 배치하는 것일 수 있습니다. 등록 양식이 구성원 자격 컨트롤러의 등록 작업에 게시되면 로그인 작업이 구성원 자격 컨트롤러의 로그인 작업에 게시됩니다. 오류가 당신이 할 수있는 작업 중 하나에서 발생하는 경우

:

  • 가 URL에 오류 메시지를
  • 리디렉션을 보여주기 위해 전용 로그인/등록 페이지 및 사용 모델/검증 결과를 표시/조치 사용자가 대신 제출이 유효 할 때 RedirectResult을 반환하는에서 오는이 작업을 수행하는
1

리디렉션을 위해 자바 스크립트를 사용하지 않고 : 양식을 안에 넣으면 r 자식 뷰, Beginform 헬퍼 (자식 뷰 내부)에서 동작 이름과 컨트롤러 이름을 지정하면이 문제가 발생하지 않는 경우가 있습니다.당신은 "InsertComment"액션 내부 RedirectAction 명령을 넣을 수 있습니다 모든 것이 작동합니다, 지금

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

: 전에

:

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

후 예를 들어,이 같은 내 아이의 행동보기를 변경했습니다.


두 형태의 한 페이지 관리 :

버튼 (각 양식) 제출에 대한

1.Specify 이름 (예 : "를 submitvalue")를

유치원 1 :

<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을 결정하는 우리의 목표입니다 .
관련 문제