如何在具有不同类型的强类型视图中处理强类型模式

时间:2013-06-29 18:47:13

标签: c# asp.net-mvc asp.net-mvc-4 modal-dialog strongly-typed-view

我正在使用模式登录和注册用户。每个模态都是强类型的,以便使用ASP.NET内置帐户类(RegisterModelLoginModel)。但是,由于调用这些模态的两个按钮位于导航栏上并且导航栏位于每个页面上,因此我收到错误,因为大多数视图都是强类型的,因此无法处理使用不同强类型模型的部分视图(模态)

如何在强类型环境中处理强类型模式?

_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

相关说明: 由于我的模态中有表单,如何在发生验证错误时返回那些模态?理想情况下,模式应该再次弹出(或永远不会被关闭),并显示验证错误。

1 个答案:

答案 0 :(得分:1)

@Html.Partial中存在一个带有对象的重载,用于部分页面的模型。如果在布局中包含Partial,则在每个页面中都需要一个逻辑来保存该数据。例如,如果您执行LoginModelRegisterModel,则可以执行此操作:

@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");