MVC3 два частичных представления в одном представлении - PullRequest
2 голосов
/ 11 апреля 2011

Я пытаюсь изучить 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 ]

3 голосов
/ 11 апреля 2011

Вы читаете сообщения об исключениях?

A public action method 'Register' was not found on controller 'AudioRage.Controllers.HomeController'

Теперь посмотрите на код HomeController, который вы опубликовали.Видите ли вы действие регистрации на нем?Я не знаю.

Так что добавьте:

public ActionResult Register()
{
    ...
}

В вашем HomeController есть действие, которое называется Register, но действие доступно только через глаголы POST, поскольку оно украшено [HttpPost] атрибут:

[HttpPost]
[ActionName("Register")]
public ActionResult Index(RegisterModel model)

, поэтому вы не можете вызвать его с помощью глагола GET на /Home/Register.

1 голос
/ 12 апреля 2011

Я не могу точно воспроизвести вашу ситуацию, но я бы сказал, что ваши частичные формы публикуются неправильно.Взгляните на визуализированный html страницы и проверьте, куда отправляются формы.Я предполагаю, что они отправляются на акцию Index.В сочетании с редиректом, я думаю, именно отсюда исходит бесконечный цикл.

Я предполагаю, что HTML-код, отображаемый для обеих форм, похож и отправляет одно и то же действие, то есть <form action="/" method="post">, поскольку они отображаютсяс помощью действия Index HomeController.

Измените частичные формы (_Login.cshtml и _Register.cshtml) и явно укажите, какую комбинацию действия / контроллера следует публиковать ( больше на 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...