加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 为什么不在View中使用Linq

发布时间:2020-12-16 07:28:47 所属栏目:asp.Net 来源:网络整理
导读:某处我不得不使用 linq语句从我的Model中选择一个结果集,该控制器在Index ActionResult中返回. 为了做到这一点,我用谷歌搜索“如何在视图剃须刀中使用linq”,我得到了结果,我的应用程序正常工作,但我看到一些建议说“不要在视图中使用 Linq”. 为什么我们不
某处我不得不使用 linq语句从我的Model中选择一个结果集,该控制器在Index ActionResult中返回.
为了做到这一点,我用谷歌搜索“如何在视图剃须刀中使用linq”,我得到了结果,我的应用程序正常工作,但我看到一些建议说“不要在视图中使用 Linq”.
为什么我们不应该使用它,但它可能吗?
如果我不想使用它,解决方案是什么?

这是我的查询:

@using System.Linq
 @{var lst = (from x in item.Showtimes select x.ShowtimeDate).Distinct();}
 @foreach (var showTimeItem in lst)
    {
      <option value="@showTimeItem">@showTimeItem</option>   
    }

UPDATE

这是我的控制器索引

public ActionResult Index()
        {
            MelliConcert.Models.MelliConcertEntities db = new  Models.MelliConcertEntities();
            var listOfConcerts = (from x in db.Concert
                                  orderby x.ID ascending
                                  select x).Take(15).ToList();
            return View(listOfConcerts);
        }

我在这个视图中使用它:

@model IEnumerable<MelliConcert.Models.Concert>
 @foreach (var item in Model)
            {
               @if (item.OpenedForFirst == true)
               { 
                   //... 
               }
               //Some Codes
               @using System.Linq
               @{var lst = (from x in item.Showtimes select x.ShowtimeDate).Distinct();}
               @foreach (var showTimeItem in lst)
               {
                 <option value="@showTimeItem">@showTimeItem</option>   
               }
            }

我的linq语句放在这个循环中.
我该怎么办?

解决方法

在视图中使用LINQ本身没有任何错误.问题不是你正在使用LINQ,问题是你这样做:

@{var lst = (from x in item.Showtimes select x.ShowtimeDate).Distinct();}

每当您必须在视图中声明和设置变量时,这可能表示您需要修改模型.为此,您的视图模型应该具有属性.像这样的东西:

public IEnumerable<SomeType> DistinctShowtimes
{
    get
    {
        return (from x in item.Showtimes select x.ShowtimeDate).Distinct();
    }
}

然后在视图中关于LINQ的观点变得毫无意义,因为您需要的是:

@foreach (var showTimeItem in Model.DistinctShowtimes)
{
    <option value="@showTimeItem">@showTimeItem</option>   
}

更新(回应您更新的问题):

现在问题(虽然略少于一个)是这样的:

@model IEnumerable<MelliConcert.Models.Concert>

虽然这很好,但它是有限的.你正在经历的是这种限制.你问自己,“我怎么回报一个以上的东西?”答案是为该视图创建自定义视图模型.现在,您的视图绑定到Concert对象的枚举.哪个好,如果这就是它需要的全部.但事实证明,并非所有需要.它有一些需要更多的自定义逻辑.因此,您可以创建自定义视图模型.像这样的东西:

public class ConcertsViewModel
{
    public IEnumerable<Concert> Concerts { get; set; }
    // other properties,methods,anything
}

然后在您的控制器操作中,您将返回其中一个:

public ActionResult Index()
{
    using(var db = new  Models.MelliConcertEntities())
    {
        var concertsModel = new ConcertsModel();
        concertsModel.Concerts = (from x in db.Concert
                                  orderby x.ID ascending
                                  select x).Take(15).ToList();
        return View(concertsModel);
    }
}

(另请注意using语句的使用,在使用IDisposable资源时应始终使用该语句.)

所以现在你的视图仍然是获取Concert对象的列表,但是它被打包在一个自定义视图模型中,你可以在其上添加该视图所需的更多功能.接下来,在您的视图中,更改模型声明:

@model MelliConcert.Models.ConcertsViewModel

(这假设您将它放在Models命名空间中.根据应用程序的规模,您可能希望将视图模型分解为它们自己的命名空间.我不经常在实际应用程序中使用Models命名空间来获取核心业务对象,所以我们的项目结构可能非常不同.这应该让你前进,但你要确保你的问题保持清晰分开.)

然后在视图代码中,您可以从该对象引用所需内容.因此,如果您需要访问列表,而不是仅调用类似@foreach(模型中的var项)的内容,则可以调用@foreach(model.Concerts中的var项).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读