2

ホームページにログインして登録フォームがあるという要件があります。これは非常に一般的なシナリオだと思いますが、これを達成するのは困難です。

このログイン フォームと登録フォームは、インデックス ビューで使用されている 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() に変更すると、上記の要件に従って動作します。ただし、ページをページに埋め込みます。(つまり、上部のナビゲーションが複製されます。) 誰か?

4

1 に答える 1

0

レジスタビュー用の部分ページ(ユーザーコントロール)を作成した方が良いと思います

_register.cshtml

(ここでは変更はありません。スクリプト セクションを削除しただけです。親ビューは必要なスクリプトをレンダリングします)

@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>
}

index.cshtml

HomeModel 内には、RegisterModel プロパティが必要です。

@model BoilKu.Web.ViewModels.HomeModel
@{
    ViewBag.Title = "Home Page";
}
@{
    Html.RenderAction("Login", "Account");
}
@{
    @Html.Partial("register", Model.RegisterModel)
}

MVC アプリケーションを作成するときは、通常、ページに必要なすべての情報を取得してモデルに入れます。このシナリオでは、HomeModel に RegisterModel の詳細が含まれています。次に、ビュー内で部分ページをレンダリングし、モデルを引数として渡すだけです。部分ビューはコントローラーに戻る必要はありません。

次に、登録ページで、部分的にレンダリングできます

@Html.Partial("register", Model.RegisterModel)
于 2013-05-16T13:36:45.823 に答える