0

我创建了一个页面来管理我的 mvc 4 应用程序中的登录和注册任务。当我使用注册创建用户时,注册失败 - 例如密码不匹配 - 页面处理错误并刷新,但在注册的渲染操作部分插入完整页面。

另一方面,当登录失败时 - 用户不存在 - 页面刷新但将用户引导到仅显示渲染操作登录部分的页面,而不是整个布局..任何帮助表示赞赏:

步骤:我创建了一个模型

public class Access
{
    public LoginModel LoginModel { get; set; }
    public RegisterModel RegisterModel { get; set; }
}

然后我创建一个页面:

<div class="main-content" style="min-height: 700px;">
    <!-- Login form -->
    @{ Html.RenderAction("Login", "Account"); }

    <!-- Register form -->
    @{ Html.RenderAction("Register", "Account"); }
    <div class="clear"></div>
</div>

控制器是 mvc4 模板中提供的典型控制器。登录示例

public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    {
        if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return PartialView(model);
}
4

1 回答 1

1

您在失败时返回 ParitalView,您可能希望返回包含整个页面的视图。即 编辑

//recreate the compound viewmodel in the login controller
 Access viewModel = new Access();
 viewModel.LoginModel = model;
 viewModel.RegisterModel = new RegisterModel();
return View("LoginOrRegister", viewModel); //supposing the view name is LoginOrRegister.cshtml

//recreate the compound viewmodel in the register controller
 Access viewModel = new Access();
 viewModel.LoginModel = new LoginModel();
 viewModel.RegisterModel = model;
 return View("LoginOrRegister", viewModel); //supposing the view name is LoginOrRegister.cshtml

loginorregister.cshtml 页面也必须使用包含 LoginModel 和 RegisterModel 的 Access 类作为 View 的模型,即。@model 访问

并且在渲染登录或注册模型时,需要传入模型参数——这样用户就不需要重新输入数据。*edit - 也尝试从 RenderAction 更改为 Html.RenderPartial() 以便它不会通过初始渲染的动作进行路由 - 这样做并在控制器上添加 [HttpPost] 注释 * 代码看起来像

@model Access
<div class="main-content" style="min-height: 700px;">
<!-- Login form -->
@{ Html.RenderPartial("Login", new {model = Model.LoginModel, returnUrl = "?"}) };

<!-- Register form -->
@{ Html.RenderPartial("Login", "Account", new { model = Model.RegisterModel) }; }
<div class="clear"></div>
</div>

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl) 
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie:     model.RememberMe))
    {
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}

// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");

//recreate the compound viewmodel in the login controller
Access viewModel = new Access();
viewModel.LoginModel = model;
viewModel.RegisterModel = new RegisterModel();
return View("LoginOrRegister", viewModel);
}

啊,也不是使用 viewbag 来最初传递数据,你必须使用模型来传递它——因为我选择在剃须刀视图中使用代码“@Model Acesss”,所以注册 ActionResult看起来像...

public ActionResult Register(){
    Access viewModel = new Access();
    viewModel.LoginModel = new LoginModel();
    viewModel.RegisterModel = new RegisterModel();
    return View("LoginOrRegister",viewModel);
} 

我没有意识到你对 mvc 这么陌生。坚持下去。:) 另一个教程可能会有所帮助

于 2013-03-24T00:42:34.320 回答