使用会话变量填充基本模型



我已经为我的layout.cshtml中所需的数据创建了一个BaseViewModel。我已经成功地让它工作,尽管我对必须填充 BaseViewModel 模型的方式不满意:

基本视图模型

public abstract class BaseViewModel
{
    public bool A { get; set; }
    public MyBList B { get; set; }
    public MyCList C { get; set; }
    public MyDList D { get; set; }
    public BaseViewModel()
    {
        A = false;
        B = new MyBList();
        C = new MyCList();
        D = new MyDList();
    }
} 

目前,我正在填充每个控制器中的数据:

型:

public class MyViewModel : BaseViewModel
{
    public List<myModel> mystuff { get; set; }
    public MyViewModel()
    {
        mystuff = new List<myModel>();
    }
}

控制器:(会话变量在函数中实现(

MyViewModel model = new MyViewModel();
model.mystuff = myfunction();
model.A = await myfunctionA();
model.B = await myfunctionB();
model.C = await myfunctionC();
model.D = await myfunctionD();

我想避免在每个控制器中放置 4 行代码。

我尝试使用 Model 构造函数,但我的会话 ID 仅在少数控制器上为空:

public bool A { get; set; }
public MyBList B { get; set; }
public MyCList C { get; set; }
public MyDList D { get; set; }
public BaseViewModel()
{
    string sessionID = HttpContext.Current.Session.SessionID;
    A = Afunction(HttpContext.Current.Request.UserAgent);
    var Btask = Task.Run(async () => { A = await Bfunction(); });
        Btask.Wait();
    var Cttask = Task.Run(async () => { C = await Cfunction(sessionID); });
        Cttask.Wait();
    var Dtask = Task.Run(async () => { D = await Dfunction(); });
}

我还尝试在基本模型中创建一个父模型:

public abstract class BaseViewModel
{
    public BaseModel model { get; set; }
    public BaseViewModel()
    {
        model = new BaseModel();
    }
} 
public abstract class BaseModel
{
    public bool A { get; set; }
    public ThemeID B { get; set; }
    public CartItemThumbModel C { get; set; }
    public MenuViewModel D { get; set; }
    public BaseModel()
    {
        A = false;
        B = new MyAList();
        C = new MyBList();
        D = new MyCList();
    }
} 

但是我需要填充的模型不会出现在控制器模型中。

是否找到了必须为每个控制器中的每个模型声明添加 4 行代码的最佳解决方案,或者我错过了什么>

您可以完全避免此方法,改用子操作。这是一个控制器操作,您可以使用 Html.Action 帮助程序从视图中调用该操作:

@Html.Action("ActionName", "ControllerName")

不要误认为是部分视图。有一个本质区别。分部视图采用您提供的参数并返回一些 html 输出。子操作可以调用操作方法来获取不依赖于提供给视图的模型的其他数据。

有一篇文章对此进行了更多的解释:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx/

但是,如果您打算开始使用子操作,则还应了解视图组件。新MVC(6/核心(的新功能。以防万一:)http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx

最新更新