好吧,我是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());
}
}
我想知道的是,如果有一种更简单的方法可以做到这一点,或者我可以做些什么来做我想做的事情,我就无法理解为什么我的观点期望有所不同,有人可以向我解释我做错了什么吗?
附言:对不起,我的英语很长,但我想了解更多:)
最佳答案
首先,需要将模型@model <MSDiary.Models.Balance>
更改为:
@model IEnumerable<MSDiary.Models.Balance>
另外,理想情况下,方法
GetBalance
应该放置在类中,而不是在GetBalance
部分视图中。您可以通过扩展方法来实现这两种方式,也可以使用Balance View模型,该模型将计算出的余额作为属性,然后传递给您的视图。例如,通过扩展方法:
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; }
}