ASP.NET MVC将查询结果从控制器传递到视图

时间:2013-03-08 21:03:23

标签: asp.net asp.net-mvc

如何在ASP.NET MVC的View页面中打印查询结果? 我的代码是:

public ActionResult Index()
{
            var list = from m in db.MenuTables
                       select m.MenuName;

            return View(list);
        }

现在应该写什么来在View Page中打印此查询的结果?

4 个答案:

答案 0 :(得分:4)

就个人而言,我会养成ViewModels的习惯,然后强烈地键入你的视图。

model将仅显示您要显示的数据。没有更多,没有更少。 所以我们假设您想要显示名称,价格和其他一些元数据。

伪代码......

//View Model
public class MenuItem
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public bool IsVegetarian { get; set; ]
}

public class IndexViewModel
{
    public IList<MenuItem> MenuItems { get; set; }
    public string MaybeSomeMessage { get; set; }
}

//in Controller
public ActionResult Index()
{
    // This gets the menu items from your db, or cache or whatever.
    var menuItemsFromDb = GetMenuItems(); 


    // Lets start populating the view model.
    IndexViewModel model = new IndexViewModel();    

    // Project the results to your model.
    IList<MenuItems> menuItems = null;
    if (menuItemsFromDb != null)
    {
        model.MenuItems = (from menuItem in menuItemsFromDb
                           select new MenuItem() {
                               Name = menuItem.Name,
                               Price = menuItem.Price,
                               IsVegetarian = menuItem.IsVegetarian
                           }).ToList();
    }

    // Anything else...
    model.MaybeSomeMessage = "Hi There!";

    return View(model);
}

//in View
@model IndexViewModel

<h3>@Model.MaybeSomeMessage</h3>
<ul>
    @foreach(var item in Model.MenuItems)
    {
        <li><a href="#">@item.Name</a> - $ @item.Price</li>
    }
</ul>

等。

注意我已经跳过了一些错误检查等等。

要点 - &gt;只传递你需要的东西。

首先,你可能会去:WTF!那是SOOO比其他答案长得多!我想写更多代码。

我可以向这个想法提出的最佳答案是,从长远来看,你会感谢你养成这个习惯,因为视图应该只知道完全数据这个需要。没有更多,没有更少。发送最少量的数据意味着您拥有一个非常简单的视图,这将使您的支持/调试更好。接下来,当你达到这个目标时,你将能够以更多的智能和智慧对你的控制器进行单元测试。

GL!

答案 1 :(得分:1)

假设listIEnumerable个字符串(即MenuName是一个字符串)。

在您的视图中,接受模型IEnumerable<string>

@model IEnumerable<string>

然后枚举它

@foreach( string s in Model )
{
 <div>
  @s
 </div>
}

答案 2 :(得分:0)

您要做的第一件事是调用ToList(),否则您可能会多次执行相同的SQL查询。

   public ActionResult Index()
   { 
        var list = (from m in db.MenuTables
                   select m.MenuName).ToList();

        return View(list);
    }

其次,我不会像这样放弃一个完整的列表。您应该创建一个ViewModel。这将允许您稍后以较小的努力传递更多数据。

     public ActionResult Index()
     {
        var model = new IndexModel();
        model.Tables = db.MenuTables.ToList();
        model.AnotherValue = "MENUS";

        return View(model);
     }

现在我们在视图中,您需要设置模型并迭代表。

 @model IndexModel

 <h3>@Model.AnotherValue</h3>
 <ul>
 @foreach( var table in Model.Tables) {
     <li>@table.Name<li>
 }
 </ul>

答案 3 :(得分:0)

     public ActionResult Index()
    {
        var list = from m in db.MenuTables
                   select m.MenuName;

        return View(list);
    }

    //In View

    @model IEnumerable<ProjectName.models.MenuTables>

    @foreach(var item in Model)
    { 
        @item.Field_Name
    }