【问题标题】:How to handle a strongly typed modal in a strongly typed view with different types如何在具有不同类型的强类型视图中处理强类型模式
【发布时间】:2013-06-29 18:47:12
【问题描述】:

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

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

_布局:

<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>

登录模式:

@model NoName.Models.LoginModel

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

【问题讨论】:

  • 当您通过@Html.Partial 调用_LoginModal 或_RegisterModal 时,为什么需要将Model 传递给它?它会包含什么?
  • @haim770:查看我对西蒙回答的评论。

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


【解决方案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");

【讨论】:

  • 我正在使用相应模式的模型来创建输入字段并对其执行验证,同时允许将输入的值轻松传输到AccountController。就我而言,当您浏览网站时,这些模式的模型可能是空的,但在必须实际使用时它们非常方便。你会建议以不同的方式做吗?
  • 如果我理解正确,即使用户移动页面,您也希望跟踪用户输入的内容。你可以这样做,但不要忘记 http 是无状态的,如果你想跟踪它,你需要定期 ping 你的服务器以将数据保存在某个地方(大概在会话字典中)。我将编辑我的答案以建议您可以做什么,但我建议您不要这样做。
  • 不需要,据我所知,您给我的答案已经完全解决了!我只需要找到一种方法将一个空模型发送到部分视图,这样编译器就不会生气它的模型与主视图不同。我不得不稍微更改语法,但您提供的解决方案似乎可以解决问题。
  • 我更新了我的答案,为您提供了一种做您想做的事情的方法。编辑:这仍然是一个有趣的练习,所以我发布了它。 ;)
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多