我正在使用模式登录和注册用户。每个模态都是强类型的,以便使用ASP.NET内置帐户类(RegisterModel
和LoginModel
)。但是,由于调用这些模态的两个按钮位于导航栏上并且导航栏位于每个页面上,因此我收到错误,因为大多数视图都是强类型的,因此无法处理使用不同强类型模型的部分视图(模态)
如何在强类型环境中处理强类型模式?
_layout:
<body>
<div class="navbar">
@Html.Partial("_LoginPartial") // contains buttons to call login/register modals
</div>
<div>
@Html.Partial("_LoginModal")
@Html.Partial("_RegisterModal")
</div>
<div class="container">
@Html.RenderBody()
</div>
</body>
/新闻/索引:
@model List<NewsBulletinViewModel>
LoginModal:
@model NoName.Models.LoginModel
相关说明: 由于我的模态中有表单,如何在发生验证错误时返回那些模态?理想情况下,模式应该再次弹出(或永远不会被关闭),并显示验证错误。
答案 0 :(得分:1)
@Html.Partial
中存在一个带有对象的重载,用于部分页面的模型。如果在布局中包含Partial,则在每个页面中都需要一个逻辑来保存该数据。例如,如果您执行LoginModel
和RegisterModel
,则可以执行此操作:
@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel())
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel())
并向执行控制器留下放置LoginModel
(或RegisterModel
)的角色。如果ViewBag
中没有任何内容,则会回退到创建一个空的。
修改:根据其他信息,我会针对LoginPartial
执行此操作(RegisterPartial
将采用相同的逻辑):
public class AccountController : Controller
{
public ActionResult LoginPartial()
{
return PartialView("_LoginPartial", (Session["Login"] as LoginModel) ?? new LoginModel());
}
[HttpPost]
public HttpStatusCodeResult SaveLoginModel(LoginModel model)
{
Session["Login"] = model;
return new HttpStatusCodeResult(200);
}
}
然后,在_LoginPartial
中,按照您的意愿执行,但添加一个javascript代码,以便在值更改时向控制器的SaveLoginModel
操作发送ajax发布请求,以使模型保持同步(关于如何做到这一点有很多信息)。
现在,而不是:
@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel())
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel())
你会这样做:
@Html.Action("LoginPartial", "AccountController");
@Html.Action("RegisterPartial", "AccountController");