2

短いバージョン: ViewUserControl (つまり、ログイン フォーム) が自分自身にポストし、リダイレクト (つまり、ログインが成功した場合) できるか、検証の概要と共に元のビュー (つまり、ホーム/インデックス) を返し、他の ViewUserControls に干渉しないようにする必要があります。ページ。

また、HomeController/Index には、ログイン フォームの内部動作に関する最小限の知識が必要です。理想的には、Html.RenderAction("Login","User") または同様のものだけが必要です。

現時点では、「子アクションはリダイレクト アクションの実行を許可されていません」というリダイレクトでスタックしています。理由はわかっていますが、回避策があるかどうか、またはこれを行うべき別の方法があるかどうか疑問に思っています。

私が達成しようとしていることの詳細:

  • サイト全体で再利用されるログイン (または任意の) フォームをカプセル化する
  • 自分に投稿
  • ログイン/検証が失敗した場合、検証の概要を含む元のページを表示します
    • (ログインページに投稿して、そこに検証の概要を表示するだけだと主張する人もいるかもしれません。私が達成しようとしていることが不可能な場合は、そのルートに行きます)
  • ログインに成功すると、/App/Home/Index にリダイレクトされます
  • また、したい:
    • PRGの原則に固執する
    • ajaxを避ける
    • ログイン フォーム (UserController.Login()) を可能な限りカプセル化します。ログインフォームは別の場所に表示される可能性があるため、 HomeController.Login() を実装する必要はありません

リダイレクト以外はすべて機能します。これまでの私のアプローチは次のとおりです。

  • Home/Indexログインフォームが含まれています:<%Html.RenderAction("Login","User");%>
  • User/Login ViewUserControl<UserLoginViewModel>以下が含まれます:
    • using(Html.BeginForm()){}
    • 非表示のフォーム フィールドを含む"userlogin"="1"
public class UserController : BaseController {
    ...
    [AcceptPostWhenFieldExists(FieldName = "userlogin")]
    public ActionResult Login(UserLoginViewModel model, FormCollection form){
        if (ModelState.IsValid) {
            if(checkUserCredentials()) {
                setUserCredentials()
                return this.RedirectToAction<Areas.App.Controllers.HomeController>(x => x.Index());
            }
        else {
            return View();
        }
    }
    ...
}

次の場合にうまく機能します: ModelState または User Credentials が失敗します -- return View() は Home/Index に戻り、適切な検証の概要を表示します。

(同じ構造を使用して、同じページに登録フォームがあります。各フォームの検証の概要は、そのフォームが送信されたときにのみ表示されます。)

次の場合に失敗します: ModelState およびユーザー資格情報が有効です -- RedirectToAction<>() は次のエラーを返します:
「子アクションはリダイレクト アクションの実行を許可されていません。」

Classic ASP の時代には、これは で解決されていたようResponse.Buffer=Trueです。現在、同等の設定または回避策はありますか?

ところで、実行中: ASP.Net 4、MVC 2、VS 2010、Dev/Debugging Web Server

それがすべて理にかなっていることを願っています。

それで、私のオプションは何ですか?または、私のアプローチのどこが間違っていますか?ティア!

4

2 に答える 2

0

古い質問ですが、これは基本的に私が現在行っていることとまったく同じであり、私の検索でもすべての基準に一致する回答はまだ見つかりませんでした。ログイン プロセスをこのように完全にカプセル化するのが難しい理由はわかりませんが、明確に記述された例が欠けているだけかもしれません。

完全に機能する私の解決策は、単に古い標準を使用することです

System.Web.HttpContext.Current.Response.Redirect(url, true);

...ログインプロセスのコントローラーで。

機能し、カプセル化を維持し、私が見た return-a-view-contain-a-Javascript-redirect ソリューションよりも少し恐ろしくないので投稿しますが、これを達成する方法についてはまだより良いアイデアが欲しいですよりMVCの方法での一種のパッケージ化。

于 2014-06-16T13:53:08.917 に答える
0

MasterPage/_Layout に配置できる部分ビュー (「_Login.cshtml」または「_Login.ascx」など) を使用します。部分ビュー内で、コントローラのアクションにポストするフォーム タグを記述します (「AuthController」とアクション「LogIn」としましょう)。どこから来たかを思い出すために

アクションは次のようになります。

public ActionResult LogIn(string username, string password) 
// name the id's of the form elements as the parameters
{
    if(YouAuthMethodHere(username, password))
    {
         return View("Welcome");
    }
    else
    {
         return Redirect(HttpContext.Current.Request.Referer.AbsolutUri);
    }
}

ユーザーの認証に成功すると、"Welcome.cshtml"/"Welcome.aspx" という名前のビューが返されます。それ以外の場合は、フォームが送信された場所からリダイレクトされます。

注: リファラーは null になる可能性があるため (たとえば、フィドラーのようなブラウザーではない場合や、スクリプトが要求を行っている場合)、エラー処理が少し残っています。

于 2011-04-08T15:56:15.767 に答える