【问题标题】:View expecting IEnumerable查看期望 IEnumerable
【发布时间】:2016-07-13 09:19:35
【问题描述】:

嗯,我在 Asp.net Mvc 中有点新,我从头开始学习,我有一个控制支出和收入的应用程序,我现在要做的是,根据收入和支出列表给我平衡来自用户,我在尝试控制它时遇到了很多问题,我不知道我是否以正确的方式进行操作

这是我的模型:

public class Balance
    {
        public int BalanceId { get; set; }
        public List<Expense> Despesas { get; set; }
        public List<Earning> Rendimentos { get; set; }
        public string ApplicationUserId { get; set; }
    }

我所做的是,首先尝试控制用户何时插入收入或类似的行,验证用户是否已在控制方法中的数据库中存在,如果不存在,则在费用和收入中创建他添加了 aplicationUserId 和昂贵的或收入。

我希望余额出现在每个页面中,所以我将其添加到我的 Layout.cshtml

<li>@Html.Action("GetBalance", "Home")</li>

它调用控制器 GetBalance:

public PartialViewResult GetBalance()
    {
        var userId = User.Identity.GetUserId();
        var balance = db.Balance.Where(d => d.ApplicationUserId == userId);
        return PartialView("_GetBalance",balance);
    }

将平衡模型发送到视图_GetBalance:

@model <MSDiary.Models.Balance>

<p>Saldo: @GetBalance()</p>

@functions 
{
    HtmlString GetBalance()
    {
        decimal saldo = 0;

    if (Model.Expense.Count != 0 || Model.Earning.Count != 0)
    {
        foreach (var item in Model.Despesas)
        {
            balance += item.EarningValue;
        }
        foreach (var item in Model.Rendimentos)
        {
            balance -= item.ExpenseValor;
        }
    }

    return new HtmlString(balance.ToString());
}
}

我想知道的是,如果有更简单的方法可以做到这一点,或者我可以做些什么来做我想做的事,我不明白为什么我的观点期望不同的东西有人可以解释我做错了什么?

Ps:对不起,很长的帖子和英文,但我想了解更多:)

【问题讨论】:

    标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


    【解决方案1】:

    首先需要将模型@model &lt;MSDiary.Models.Balance&gt;改为:

    @model IEnumerable<MSDiary.Models.Balance>
    

    另外,GetBalance 方法最好放在不在GetBalance 部分视图中的类中。您可以通过扩展方法或使用余额视图模型来实现这两种方式,该模型将计算出的余额作为属性传递给您的视图。

    作为一个通过扩展方法的例子:

    public static class BalanceExtensions
    {
        public static string GetBalance(this Balance balance) 
        {
           string displayBalance = "0:00";
    
           // Your logic here 
           return displayBalance;
        }
    }
    

    然后在您的部分视图中,您可以使用新的 HTML Helper:

    @Html.GetBalance();
    

    作为附加说明,我会将费用和收入的 List 更改为 IEnumerable,因为看起来您只是公开数据而不是操纵数据。

    您的模型将如下所示:

    public class Balance
    {
       public int BalanceId { get; set; }
       public IEnumerable<Expense> Despesas { get; set; }
       public IEnumerable<Earning> Rendimentos { get; set; }
       public string ApplicationUserId { get; set; }
    }
    

    【讨论】:

    • 感谢您的回答,我不喜欢在不了解的情况下使用东西所以我有 1 个问题,IEnumerable 与列表相同,但我们使用一个来操作而其他只是显示?抱歉新手问题,但我独自从零开始学习困难模式:)
    • @FilipeCosta - 没问题 :) - IEnumerable 公开了一个枚举器,允许您使用 foreach(就像列表一样),但是您不能像使用 List 一样添加或删除集合中的项目。它主要用于在视图中公开和显示数据。
    【解决方案2】:

    @Filipe Costa 这里有几件事。

    您可能应该将您的视图命名为与您的方法相同的名称。名称前面的下划线是相当标准的,因此我建议为该方法使用相同的名称。如果方法和视图的名称相同,您可以简单地传入模型,而不必做 PartialView 方法的名称+模型签名。更简单。

    除此之外,您的代码很好,但您的 .cshtml 部分视图应该在第一行包含此内容。这将接受您传递的列表。

    @model IEnumerable<MSDiary.Models.Balance>
    
    <h1>@Model.BalanceId</h1>
    @*Do other stuff!*@
    

    【讨论】:

    • 谢谢,我有 2 个问题,如果我的 Balance 模型有 4 个属性:2 个列表和 2 个 id,为什么我的模型应该是 IEnumerable?不能像这样@model IEnumerable,如果有一个 partialView 控制器,他希望总是一个带有下划线 +“controlerName”的视图?
    • 您的代码看起来不错,ASP.Net MVC 在显示网站的一小部分时为您提供了大量的控制和选项,有时您会觉得您所做的事情是错误的。除了这条路线之外,唯一的其他方法可能是在 Document.Load 上的 Jquery 中进行 AJAX 调用,但实际上这两种方法都很好。
    • 这是因为你使用实体框架的方式。您使用的 where 子句通常会导致多个结果。如果您正在寻找 1 个项目,请执行 FirstOrDefault ,它将为您提供 1 条记录或 null。如果您将第一个或第一个或默认查询的结果传递给视图,它将期望一个.. 而不是期望 where 的结果是 ienumerable。
    • 要根据您的代码添加此内容,我假设每个用户只有 1 个余额。因此,您可以将 where 更改为 first 或 first 或 default,然后从您的视图中删除对 ienumerable 的引用。
    • 我知道 firstOrDefault 但例如在我的 Expense 模型中我也有一个 where 我将 AplicationUserId 与 currenUserId 进行比较并且我不需要 IEnumerable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2018-10-12
    • 2011-01-20
    相关资源
    最近更新 更多