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 还是很陌生。

更新 将注册控制器返回从 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>
}

索引.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 回答