我有一个要求,我在主页上有登录和注册表格。我相信这是一个非常常见的情况,但我很难实现这一点。
此登录和注册表单是两个单独的强类型部分视图,正在索引视图中使用
以下是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");
}
现在使用上面的代码,我设法让局部视图显示在主页上。但是,当我在填写详细信息后单击“注册”时,它将自动重定向到我的注册页面,其中包含预先填充的字段。这不是我想要的。我希望寄存器发生在主页上,并在成功注册后重定向到Profile页面。我该怎么做呢?感谢您对noobishe问题的阅读和道歉。我对MVC还很陌生。
更新 将Register Controller从PartialView()更改为View()将根据上述要求进行操作。但是它会将页面嵌入到页面中。 (即顶部导航将被复制。) 任何人吗?
答案 0 :(得分: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)