Asp.net 干扰分部词的模型

Asp.net 干扰分部词的模型,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,因此,目前在我的布局文件中,我有一个全局登录和注册系统,它将显示在每个页面上: <div id="global_login_register"> <div id="login"> @Html.Partial("_LoginPartial") </div> <div id="register"> @Html.Partial("_RegisterPartial") </div> </di

因此,目前在我的布局文件中,我有一个全局登录和注册系统,它将显示在每个页面上:

<div id="global_login_register">
   <div id="login">
      @Html.Partial("_LoginPartial")
   </div>
   <div id="register">
      @Html.Partial("_RegisterPartial")
   </div>
</div>

@RenderBody()

@Html.Partial(“_LoginPartial”)
@Html.Partial(“_RegisterPartial”)
@RenderBody()

在我的loginPartial页面中,我有一个@model LoginModel,在我的注册表中,我有@model RegisterModel。到目前为止,一切都正常,但问题是当我尝试向View()提交另一个模型时,它会干扰登录部分。解决此问题的唯一方法是使用ViewBag并将我的模型保存到那里吗?

如果您的partial需要模型,则需要通过partial调用传递它:
@Html.partial(“\u LoginPartial”,aLoginModel)
。更难的问题是在哪里可以找到
aLoginModel
,还有一些可能的选择

  • 使用
    @Html.Action(…)
    遵从一个单独的控件(可以为您构建
    LoginModel
    )——通常不值得整个控制器生命周期的开销,但如果您负担得起,它是一个干净的解决方案
  • 为您的
    LoginModel
    使用一个接口,并要求每个视图模型都实现它——几乎可以肯定这不是一个好主意,但它可以工作
  • 使用某种机制将
    LoginModel
    存储在
    ViewBag/ViewData
    中,该机制保证在渲染视图之前执行
  • 编写自己的
    Html
    帮助程序,它知道如何从
    HtmlHelper
    上下文构建
    LoginModel
    。您可以在_布局中使用该结果(例如
    @Html.Partial(“\u LoginPartial”,Html.LoginModel)
    ),或者将
    Partial
    调用放在帮助程序中(例如
    @Html.Login()

  • 对于任何性能关键的问题,我都会使用#4。

    您不应该使用ViewBag将模型传递给视图。一个选项是创建一个ViewModel,该ViewModel将主模型类、LoginModel和RegisterModel作为属性。这取决于你有多少不同的观点。我需要更多关于您的应用程序的信息,以便为您提供最佳选择。上面的问题是,如果我有另一个控制器页面,我将不得不将它以及模型添加到该ViewModel中。如果我将所有模型放入一个ViewModel类中,会不会有问题?不,您可以为另一个控制器(模型)创建单独的ViewModel。这就是为什么我说这取决于你有多少型号/控制器。但是,即使您有很多控制器,也可以创建一个包含LoginModel和RegisterModel的BaseViewModel,然后使所有其他ViewModel继承自BaseViewModel。您可以发布LoginModel、RegisterModel及其部分视图的代码吗?您知道关于#4的任何优秀教程吗?这正是我需要的。谢谢所有这些信息。还有,为什么#2是个坏主意?第#4的例子:#2可能是个坏主意,因为实现它的唯一合理方法是使用模型基类——每次我这么做,我都会后悔。此外,您还需要在控制器生命周期的某个时刻初始化登录相关状态(可能是一个检查视图模型是否实现该接口的
    OnActionExecuted
    过滤器)。