【问题标题】:ASP.NET Returning Multiple Variables to ViewASP.NET 返回多个变量以查看
【发布时间】:2017-05-04 19:44:37
【问题描述】:

我无法弄清楚如何将多个变量返回到视图。像这样的东西。我能得到一点帮助吗?

    public ActionResult CheatSheet()
    {
        var var1 = from ts in db.thisdatabase
                   select ts;

        var var2 = from ls in db.thisdatabase
                   select ls;

        var var3 = from d in db.thisdatabase
                   select d;

        return View(var1,var2,var3);
    }

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    考虑使用 ViewModel

    您需要使用 ViewModel 来组合所有这些不同的结果并将该模型传递给 View:

    public class ExampleViewModel
    {
          // Example collections for each of your types
          public IEnumerable<Something> CollectionA { get; set; }
          public IEnumerable<Something> CollectionB { get; set; }
          public IEnumerable<Something> CollectionC { get; set; }
    }
    

    然后只需使用类似以下代码的代码来执行您的特定查询,并使用这些查询的结果来构建您的模型,然后将其传递给视图:

    // Build the model
    var model = new ExampleViewModel(){
    
         // You'll likely want a .ToList() after these to ensure things work as expected
         CollectionA = db.thisdatabase.Select(x => x.ts),
         CollectionB = db.thisdatabase.Select(x => x.ts),
         CollectionC = db.thisdatabase.Select(x => x.ts),
    };
    
    // Pass it to your View
    return View(model);
    

    注意:这假设您实际上并没有用每个查询查询同一个确切的表。如果是这种情况,那么使用您的每个属性拉回一个集合然后将您的各个属性集合分配给模型可能会更有效(而不是执行多个可能是冗余的查询。

    然后在视图中,您可以按预期引用底层属性集合并遍历它们或执行任何其他类型的操作:

    @model YourProject.ViewModels.ExampleViewModel
    
    @foreach (var item in Model.CollectionA) { ... }
    @foreach (var item in Model.CollectionB) { ... }
    @foreach (var item in Model.CollectionC) { ... }
    

    更复杂的场景

    如果您不想简单地访问数据库中的单个列,而是访问多个列,您可能希望创建另一个模型/类来映射您的属性,然后将这些属性的实例存储在您的 ViewModel 中。

    让我们看看你的例子,看看它是如何工作的。所以您目前正在寻找存储tslsd 属性,所以让我们创建一个类来存储它们:

    public class Example
    {
         public string Ts { get; set; }
         public string Ls { get; set; }
         public string D { get; set; }
    }
    

    现在,当您执行查询时,只需获取所有这些并将它们映射到 Select() 调用中:

    // This will now be an IEnumerable<Example>
    var models = db.thisdatabase.Select(x => new Example()
    {
        Ts = x.ts,
        Ls = x.ls,
        D = d
    });
    

    如果这就是您所需要的,您现在可以将它直接传递给您的视图:

    // If you did this, you'd need to adjust your @model declaration
    return View(model);
    

    或者,如果您需要为不同的表构建不同的模型,然后将所有这些集合组合成类似于原始示例的 ViewModel,您可以执行其中的多个:

    var model = new ExampleViewModel(){
         CollectionA = db.thisdatabase.Select(x => new Example(x)),
         CollectionB = db.othertable.Select(x => new OtherExample(x)),
         CollectionC = db.yetanother.Select(x => new LastExample(x))
    };
    

    其他存储形式

    您可以根据需要考虑其他一些方法,例如使用ViewBag 集合。 ViewBag 是一个动态集合,可让您轻松存储和访问 View 中的对象:

    ViewBag.A = db.thisdatabase.Select(x => x.ts),
    ViewBag.B = db.thisdatabase.Select(x => x.ts),
    ViewBag.C = db.thisdatabase.Select(x => x.ts),
    
    return View();
    

    这将基本上以相同的方式工作,但不是在您的视图中引用@Model,而是使用@ViewBag。还值得注意的是,这也可以与实际模型结合使用。

    还有其他方法,例如使用 ViewDataSession 集合,但您真的应该使用模型。它更符合实际的 MVC 模式,如果你习惯了它,它应该会让你的生活更轻松。

    【讨论】:

    • 我认为将这三个查询合二为一可能会很棒,因为它们查询的是 smae 表 :)
    • 我假设这是出于示例目的,它们实际上并没有针对同一个表。如果是这样的话,那肯定是首选。
    • 好的,但是在这种情况下集合 a,b,s 有多个列,我还可以使用public IEnumerable&lt;Something&gt; 来执行此操作吗?
    • 如果他们有多个列,那么您可能想要做的就是更进一步,将每个列(您需要的)映射到您自己的模型/类Select() 然后将这些特定类的集合存储在您的 ViewModel 中(例如 IEnumerable&lt;SomeAClass&gt;),如果这有意义的话。我将很快提供一个示例。
    • 你去吧,我希望能澄清一点。
    【解决方案2】:

    您可以使用ExpandoObject 在您的视图中传递dynamic 模型。

    示例:

    控制器:

     public ExpandoObject ToExpando( object anonymousObject)
        {
            IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
            IDictionary<string, object> expando = new ExpandoObject();
            foreach (var item in anonymousDictionary)
                expando.Add(item);
            return (ExpandoObject)expando;
        }
    
    
     public ActionResult CheatSheet()
        {
            var var1 = from ts in db.thisdatabase
                       select ts;
    
            var var2 = from ls in db.thisdatabase
                       select ls;
    
            var var3 = from d in db.thisdatabase
                       select d;
              var model= ToExpando(new{ var1 =var1 ,var2 =var2 , var3 =var3})
            return View(model);
        }
    

    查看:

    @foreach (var item in Model.var1 ) { ... }
    @foreach (var item in Model.var2 ) { ... }
    @foreach (var item in Model.var3 ) { ... }
    

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 2013-12-05
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多