我正在努力学习MVC 3&我和Razor在这里待了3个小时。这就是我所拥有的
MVC项目使用带有帐户注册的默认模板和模板中的所有好东西创建。我想要做的是在HomeController的索引中同时注册页面和登录页面,所以我为Register(_RegisterPartial)和LogOn(_LogOnPartial)创建了一个局部视图。当我进入索引页面时,我看到注册和登录表单很好,但是当我尝试登录或注册时,它会进入无限循环。
我的HomeController看起来像这样;
// **************************************
// Registration
// **************************************
public ActionResult DoRegister()
{
return PartialView("_Register");
}
[HttpPost]
public ActionResult DoRegister(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email, model.UserProfile);
if (createStatus == MembershipCreateStatus.Success)
{
FormsService.SignIn(model.UserName, false); // createPersistentCookie
return View("Success");
}
else
{
ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
ViewBag.PasswordLength = MembershipService.MinPasswordLength;
return View(model);
}
// **************************************
// Login
// **************************************
public ActionResult DoLogin()
{
return PartialView("_Login");
}
[HttpPost]
public ActionResult DoLogin(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
// logged in
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
Redirect(returnUrl);
}
else
{
View("Success");
}
}
else
{
// Not logged in
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View("Success");
}
我的cshtml看起来像这样;
@{
ViewBag.Title = "Home Page";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@if (Request.IsAuthenticated)
{
@Html.ActionLink("Log Off", "LogOff", "Account")
}
else
{
Html.RenderAction("DoLogin");
Html.RenderAction("DoRegister");
}
此致
赖安
答案 0 :(得分:3)
您是否阅读了异常消息?
A public action method 'Register' was not found on controller 'AudioRage.Controllers.HomeController'
现在查看您发布的HomeController
代码。你看到一个Register动作吗?我没有。
添加一个:
public ActionResult Register()
{
...
}
在您的HomeController
中,您有一个名为“注册”的操作,但操作只能通过POST动词访问,因为它使用[HttpPost]
属性进行修饰:
[HttpPost]
[ActionName("Register")]
public ActionResult Index(RegisterModel model)
因此您无法使用/Home/Register
上的GET动词调用它。
答案 1 :(得分:1)
我不能完全复制你的情况,但我会说你的部分表格没有正确发布。看看页面的渲染html并检查表单的发布位置。我的猜测是他们被发布到Index
行动。再加上重定向,我认为这就是无限循环的来源。
我的猜测是两个表单呈现的html类似并发布到相同的操作,即<form action="/" method="post">
,因为它们是由HomeController的Index操作呈现的。
更改部分表单(_Login.cshtml
和_Register.cshtml
)并明确说明要发布到(more on Html.BeginForm来自MSDN)的操作/控制器组合
@using (Html.BeginForm("DoLogin","Home")) {/*snipped*/} //in _Login.cshtml
@using (Html.BeginForm("DoRegister","Home")) {/*snipped*/} //in _Register.cshtml
我还会将Html.RenderAction
来电更改为
Html.RenderPartial("_Login");
Html.RenderPartial("_Register");