ホームページにログインして登録フォームがあるという要件があります。これは非常に一般的なシナリオだと思いますが、これを達成するのは困難です。
このログイン フォームと登録フォームは、インデックス ビューで使用されている 2 つの別個の厳密に型指定された部分ビューです。
以下は、Register のコントローラーです。これが機能するようになれば、他のログインも同様になるはずなので、ログインをスキップします。
コントローラの登録
//
// GET: /Account/Register
[AllowAnonymous]
public ActionResult Register()
{
return PartialView();
}
//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel registerModel)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
_webSecurity.CreateUserAndAccount(registerModel.Email, registerModel.Password,
new { registerModel.FirstName, registerModel.LastName, registerModel.Email });
_webSecurity.Login(registerModel.Email, registerModel.Password);
return RedirectToAction("Manage", "Account");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(registerModel);
}
インデックス コントローラー
//
// GET: /Home/
public ActionResult Index()
{
//
// If logedin redirect to profile page
// Else show home page view
//
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
if (Request.IsAuthenticated)
{
return RedirectToAction("Manage", "Account", new { id = HttpContext.User.Identity.Name });
}
return View();
}
ビューの登録
@using System.Web.Optimization
@model BoilKu.Web.ViewModels.RegisterModel
@using (Html.BeginForm("Register","Account", FormMethod.Post)) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
</li>
...
... Omitted codes
...
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
インデックス ビュー
@model BoilKu.Web.ViewModels.HomeModel
@{
ViewBag.Title = "Home Page";
}
@{
Html.RenderAction("Login", "Account");
}
@{
Html.RenderAction("Register", "Account");
}
上記のコードで、部分ビューをホームページに表示することができました。ただし、詳細を入力した後に「登録」をクリックすると、フィールドが事前に入力された登録ページに自動的にリダイレクトされます。これは私が望むものではありません。ホームページで登録が行われ、登録が成功するとプロフィールページにリダイレクトされると思います。どうすればこれを行うことができますか?読んでくれてありがとう、noobisheの質問をお詫びします。私はまだMVCにかなり慣れていません。
更新 Register Controller の戻り値を PartialView() から View() に変更すると、上記の要件に従って動作します。ただし、ページをページに埋め込みます。(つまり、上部のナビゲーションが複製されます。) 誰か?