MVC3在一个视图中有两个局部视图

时间:2011-04-10 20:40:16

标签: asp.net-mvc asp.net-mvc-3 razor

我正在努力学习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");
}

此致

赖安

2 个答案:

答案 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");