【问题标题】:How to show only the last record in a view ASP MVC如何在视图 ASP MVC 中仅显示最后一条记录
【发布时间】:2018-03-21 20:26:47
【问题描述】:

我正在使用存储过程(没有实体框架)开发一个 ASP MVC 项目。

在公式中设置数据后,我只想显示最后一条记录,而不是从我的数据库中获取所有数据。

我知道我可以编写另一种仅选择最后一条记录的方法,但我想知道是否有解决方案可以从视图中检索它。

这是我尝试过的:

  @for (var i = 0; i < 1; i++) { 
        @foreach (var item in Model)
        {
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.FirstName)
                </th>
                <td>
                    @Html.DisplayFor(modelItem => item.FirstName)
                </td>
            </tr>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.LastName)
                </th>
                <td>
                    @Html.DisplayFor(modelItem => item.LastName)
                </td>
            </tr>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Address)
                </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Address)
                </td>
            </tr>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Email)
                </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Email)
                </td>
            </tr>
            <tr>
            <th>
                @Html.DisplayNameFor(model => model.Phone)
            </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Phone)
                </td>
            </tr>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Date)
                </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Date.Date)
                </td>
             </tr>
             <tr>
                   <th>
                       @Html.DisplayNameFor(model => model.Time)
                   </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Time)
                </td>
               </tr>
               <tr>
                   <th>
                       @Html.DisplayNameFor(model => model.Nbre_P)
                   </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Nbre_P)
                </td>
               </tr>
               <tr>
                   <th>
                       @Html.DisplayNameFor(model => model.Items)
                   </th>
                <td>
                    @Html.DisplayFor(modelItem => item.Items)
                </td>
                   </tr>

        } } 

模型 Bestellung.cs :

public class Bestellung
{
    public int BestellungId { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public string Time { get; set; }

    public int Nbre_P { get; set; }

    public string Items { get; set; }

    [Display(Name = "Phone Number")]
    [DataType(DataType.PhoneNumber)]
    [Required(ErrorMessage = "Phone is required.")]
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Entered phone format is not valid.")]
    public String Phone { get; set; }

    [Display(Name = "Email")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [Required(ErrorMessage = "Email is required.")]
    [DataType(DataType.EmailAddress)]
    [StringLength(30)]
    public string Email { get; set; }


    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name is required.")]
    [StringLength(30)]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name is required.")]
    [StringLength(30)]
    public string LastName { get; set; }

    [Display(Name = "Address")]
    [Required(ErrorMessage = "Address is required.")]
    [StringLength(30)]
    public string Address { get; set; }
}

【问题讨论】:

  • 如果您只想在视图中显示最后一条记录,那么为什么要从数据库中查询多条记录?为什么要向视图传递多条记录?只需查询您需要的内容,然后只将您需要的内容传递给您的视图。
  • 是的,我知道,但多个查询用于另一个视图
  • 这里的model 是什么?它应该是一个集合,因此您可以对其进行迭代。理想情况下,您应该只获取最后一条记录,但根据您的要求,在变量 var lastRecord = model.LastOrDefault(); 或`var lastRecord = model[model.count-1];'中获取最后一条记录是有意义的.在这种情况下你不需要循环
  • 谢谢你们,但 mjwills 的建议效果很好,@mjwills 你能不能把你的解决方案发布在我可以接受的答案中

标签: c# sql-server asp.net-mvc stored-procedures


【解决方案1】:

一种可能的解决方案是改变:

@foreach (var item in Model)

到:

@foreach (var item in Model.Reverse().Take(1))

这仍然保持循环结构(即foreach),但确保它只会处理原始Model中的最后一项。

【讨论】:

    【解决方案2】:

    考虑到您的 Model 属于 IEnumerable&lt;T&gt; 类型,不确定您为什么不能只使用返回最后一个元素的 LINQ Last() 方法

    【讨论】:

    • 因为模型不包含 GetEnumerator 的公共定义
    • @Exact,发布Model的类型
    • @Exact,所以从您的控制器中您传递的是单个实例或列表?
    • 我传递了一个实例,如果你想看看它是如何工作的,我可以为你发布控制器的代码,但我已经使用 Model.Reverse().Take(1)) 解决了这个问题
    【解决方案3】:

    你不想那样做。

    如果你在视图中过滤它,这是可能的,但我不推荐它,你已经加载了整个列表模型项。为什么你甚至想这样做?

    控制器的任务是过滤您的数据并仅发送所需的项目。 在控制器调用中

    Model.LastOrDefault();
    

    【讨论】:

    • 模型不包含 GetEnumerator 的公共定义,我找到了解决方案,我必须使用 Model.Reverse().Take(1))
    • 请问你的Model是什么类型的?
    【解决方案4】:

    如果您只想显示最后一条记录而不是从我的数据库中获取所有数据。 你可以用这个:

    在控制器中:

    var Bestellung = db.Bestellungs.OrderByDescending(p => p.BestellungId ).FirstOrDefault();
    

    将为您提供 Bestellungs 的最后一张唱片

    【讨论】:

      【解决方案5】:

      试试这个。无需重复任何循环

      <tr>
                  <th>
                      @Html.DisplayNameFor(model => model.FirstName)
                  </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().FirstName)
                  </td>
              </tr>
              <tr>
                  <th>
                      @Html.DisplayNameFor(model => model.LastName)
                  </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().LastName)
                  </td>
              </tr>
              <tr>
                  <th>
                      @Html.DisplayNameFor(model => model.Address)
                  </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Address)
                  </td>
              </tr>
              <tr>
                  <th>
                      @Html.DisplayNameFor(model => model.Email)
                  </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Email)
                  </td>
              </tr>
              <tr>
              <th>
                  @Html.DisplayNameFor(model => model.Phone)
              </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Phone)
                  </td>
              </tr>
              <tr>
                  <th>
                      @Html.DisplayNameFor(model => model.Date)
                  </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Date.Date)
                  </td>
               </tr>
               <tr>
                     <th>
                         @Html.DisplayNameFor(model => model.Time)
                     </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Time)
                  </td>
                 </tr>
                 <tr>
                     <th>
                         @Html.DisplayNameFor(model => model.Nbre_P)
                     </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Nbre_P)
                  </td>
                 </tr>
                 <tr>
                     <th>
                         @Html.DisplayNameFor(model => model.Items)
                     </th>
                  <td>
                      @Html.DisplayFor(modelItem => Model.LastOrDefault().Items)
                  </td>
                     </tr>
      

      【讨论】:

      • 这个方法太多余了。无需一遍又一遍地调用 LastOrDefault()
      • 您是否意识到您可能会多次调用“LastOrdefault”,这可能会被缓存在一个变量中。
      【解决方案6】:

      您的模型应该是模型对象列表,而不仅仅是模型 最好将您的对象存储在这样的对象列表中

        class viewmodel
        {
            public  list<yourclassname> propertyname; 
        }
      

      并在视图页面中使用了这个视图模型类

      @foreach(var item in Model.PropertyName.lastordefault())
      

      【讨论】:

      • 模型不包含 GetEnumerator 的公共定义
      • Ienumureble 在那里你可以使用,然后你可以循环通过上面提到的方式
      • 或者你可以像 @model "your viewmodel" 那样使用你的 viewmodel 将包含你需要循环并获取最后一条记录的对象属性列表
      • 感谢您的帮助,但我找到了解决方案,我必须使用 Model.Reverse().Take(1)
      • 但如果没有列出你将如何获得反向并取 1 ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2016-06-25
      相关资源
      最近更新 更多