使用会话变量

时间:2017-03-23 12:36:59

标签: c# asp.net-mvc entity-framework

我已经为layout.cshtml中所需的数据创建了一个BaseViewModel。我已经成功地工作了,虽然我对我必须填充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仅在少数控制器上为null:

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(); });
}

我也尝试在basemodel中创建父模型:

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行代码的最佳解决方案,或者我遗漏了某些内容&gt;

1 个答案:

答案 0 :(得分:1)

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

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

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

有一篇文章更多地解释了它:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx/

但是,如果您要开始使用子操作,您还应该了解View Components。新MVC(6 / Core)的新功能。以防万一 :) http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx