查看期望IEnumerable

时间:2016-03-25 15:35:19

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

我在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:很抱歉这篇长篇文章和英文,但我想了解更多:)

2 个答案:

答案 0 :(得分:2)

首先,模型@model <MSDiary.Models.Balance>需要更改为:

@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帮助程序:

@Html.GetBalance();

作为补充说明,我会将费用和收入更改为ListIEnumerable,因为看起来您只是公开数据而不是操纵数据。

您的模型将如下所示:

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 :(得分:1)

@Filipe Costa这里有一些事情。

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

除了你的代码很好,但你的.cshtml局部视图应该有第一行。这将接受您通过的列表。

@model IEnumerable<MSDiary.Models.Balance>

<h1>@Model.BalanceId</h1>
@*Do other stuff!*@