短いバージョン: 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
それがすべて理にかなっていることを願っています。
それで、私のオプションは何ですか?または、私のアプローチのどこが間違っていますか?ティア!