ASP.NET返回多个变量以查看

时间:2017-05-04 19:44:38

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

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

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

2 个答案:

答案 0 :(得分:5)

考虑使用ViewModel

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

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

注意:这假设您实际上并未查询每个查询的相同表格。如果是这种情况,那么用每个属性拉回单个集合然后将单独的属性集合分配给模型(而不是执行多个,可能是多余的查询)可能更有效。

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

@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是一个动态集合,允许您轻松存储和访问视图中的对象:

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模式,如果你习惯它,它会让你的生活更轻松。

答案 1 :(得分:0)

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

示例:

<强>控制器:

 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 ) { ... }