2009-09-02 47 views
3

ページにサブフォームがあるシナリオを想像してみてください。このサブフォームは、部分的なユーザーコントロールに含まれ、専用のコントローラーアクションに送信されます。ビジネスルール違反が発生した場合は、ユーザーが以前に行ったのと同じビューを返す必要があります。asp.net mvc - 前の操作に戻るにはどうすればいいですか?

例:

  • ユーザは "アカウント/サインオン" の部分 "SignOnForm"
  • サインオンフォームポストをレンダリング例/ページ1 /です。
  • 何かが無効な場合は、モデル状態をそのまま/ example/page1に戻します。しかし、ユーザーが/ othercontroller/page10のような別のページにいる可能性があるため、ビューをハードコーディングすることはできません。

答えて

0
public SignOn(string username, string password) 
{ 
    //login logic here 
    ... 

    //Now check if the user is authenticated. 
    if(User.IsAuthenticated) 
    { 
    //Redirect to the next page 
    return RedirectToAction("page10", "Other"); 
    } 
    else 
    { 
    // You could also pass things such as a message indicating the user was not authenticated. 
    return RedirectToAction("page1", "Example"); 
    } 
} 

また、あなたは常に隠されたフォームフィールドに、最後の「良い」掲載ページからフォームデータをダンプし、ユーザーが効果的に前方にそれらをポスト「戻って」ボタンをクリックするかもしれません前のページ。私は特に、これは前のフォームフィールドを維持する必要があるので、これは好きではありません。

2

リクエストクエリ文字列を使用して、SignOnプロセスを通じて返信URLをすべて取得できます。

まず、あなたが部分的にあなたのサインオンをレンダリングするたびに戻るには、ページを指定します。

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<%@ Import Namespace="Microsoft.Web.Mvc"%> 

<!-- Your Example/Page1 page --> 

<% if (!User.IsAuthenticated) %> 
    <%= Html.RenderAction("SignOn", "Account", new { returnUrl = Request.Url.PathAndQuery }); %> 

使用RenderAction現在のコンテキストがアカウントコントローラでない場合。この機能は現在MVCリリースにはないため、ASP.NET MVC's Future libraryをソリューションに含める必要があります。

次に、サインオンコントローラ:

public ActionResult SignOn(string returnUrl) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     User user = userRepository.GetItem(u => u.aspnet_UserName == User.Identity.Name); 
     return !string.IsNullOrEmpty(returnUrl) 
       ? Redirect(returnUrl) 
       : (ActionResult) RedirectToAction("Index", "Home"); 
    } 
    return PartialView(); 
} 

サインオン形式:

<% using (Html.BeginForm("SignOn", "Account", new { returnUrl = Request.QueryString["returnUrl"] },FormMethod.Post,new {@class="my_signOn_class"})) 
    { %> 
     <!-- Form --> 
<% } %> 

最後に、フォームのPOSTを処理し、あなたのサインオンコントローラで、あなたが使用して 'にreturnurl' にユーザーを返すことができます。次のコード:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult SignOn(FormCollection formCollection, string returnUrl) 
{ 
    if (BusinessRuleViolated(formCollection)) 
    { 
     if(!string.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     return RedirectToAction("Index", "Home"); 
    } 

    // SignIn(...) 
} 
関連する問題