C# o使用ViewModel,因此我只能使用ViewBag。我知道这很不专业,因为它看起来不干净、不光滑。我想我会尝试将那些我期望得到单一结果的单一查询重构为方法,但是您认为我需要对上面的代码做什么改进?提供代码示例帮助。

C# o使用ViewModel,因此我只能使用ViewBag。我知道这很不专业,因为它看起来不干净、不光滑。我想我会尝试将那些我期望得到单一结果的单一查询重构为方法,但是您认为我需要对上面的代码做什么改进?提供代码示例帮助。,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,视图模型存储视图所需的表示逻辑 尽管我质疑为什么许多计算不是模型本身的一部分,但我将其作为重构练习,将业务逻辑从viewmodel中删除到模型中 此外,我将重构视图留给读者使用viewmodel作为练习 下面是一个适用于您的物品的viewmodel示例: public class TransactionViewModel { public TransactionViewModel( List<Transaction> transactions,

视图模型存储视图所需的表示逻辑

尽管我质疑为什么许多计算不是模型本身的一部分,但我将其作为重构练习,将业务逻辑从viewmodel中删除到模型中

此外,我将重构视图留给读者使用viewmodel作为练习

下面是一个适用于您的物品的viewmodel示例:

public class TransactionViewModel
{
    public TransactionViewModel(
        List<Transaction> transactions,
        SalesAgent salesAgent)
    {
        Transactions = transactions;
        SalesAgent = salesAgent;
    }

    public List<Transaction> Transactions { get; set; }

    public SalesAgent SalesAgent { get; set; }

    public decimal MonthlyTarget
    {
        get { return (decimal) SalesAgent.MonthlyTarget; }
    }

    public string SalesAgentInitials
    {
        get
        {
            return
                string.Format(
                    "{0}.{1}.",
                    SalesAgent.FirstName.First(),
                    SalesAgent.LastName.First());
        }
    }

    public IEnumerable<Transaction> ApprovedTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Approved"); }
    }

    public IEnumerable<Transaction> PendingTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Pending"); }
    }

    public IEnumerable<Transaction> DeclinedTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Declined"); }
    }

    public int ApprovedCount
    {
        get { ApprovedTransactions.Count(); }
    }

    public int PendingCount
    {
        get { PendingTransactions.Count(); }
    }

    public int DeclinedCount
    {
        get { DeclinedTransactions.Count(); }
    }

    public int TotalCount
    {
        get { return Transactions.Count; }
    }

    public decimal ApprovedPercent
    {
        get { return (decimal) ApprovedCount / TotalCount }
    }

    public decimal PendingPercent
    {
        get { return (decimal) PendingCount / TotalCount }
    }

    public decimal DeclinedPercent
    {
        get { return (decimal) DeclinedCount / TotalCount }
    }

    public decimal ApprovedValue
    {
        get { return ApprovedTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public decimal PendingValue
    {
        get { return PendingTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public decimal DeclinedValue
    {
        get { return DeclinedTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public DateTime StartMonth
    {
        get { return new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); }
    }

    public DateTime EndMonth
    {
        get { return StartMonth.AddMonths(1); }
    }

    public int DaysInMonth
    {
        get { return (EndMonth - StartMonth).Days; }
    }

    public int WorkingDaysLeftInMonth
    {
        get
        {
            Enumerable
                .Range(DateTime.Today.Day, DaysInMonth)
                .Select(d => new DateTime(DateTime.Today.Year, DateTime.Today.Month, d))
                .Count(date =>
                    date.DayOfWeek != DayOfWeek.Saturday &&
                    date.DayOfWeek != DayOfWeek.Sunday);
        }
    }

    public decimal SpecifiedTotal
    {
        get
        {
            return
                ApprovedTransactions
                    .Where(t => t.DateApproved >= StartMonth && t.DateApproved < EndMonth)
                    .Select(t => (decimal?) t.AmountApproved)
                    .Sum() ?? 0;
        }
    }

    public decimal RunRate
    {
        get { return Math.Round((MonthlyTarget - SpecifiedTotal) / WorkingDaysLeftInMonth, 2); }
    }

    public string RunRateFormat
    {
        get { return RunRate.ToString("N0"); }
    }
}
公共类TransactionViewModel
{
公共事务视图模型(
列出交易,
销售代理(销售代理)
{
交易=交易;
SalesAgent=SalesAgent;
}
公共列表事务{get;set;}
public SalesAgent SalesAgent{get;set;}
公共十进制月目标
{
获取{return(decimal)SalesAgent.MonthlyTarget;}
}
公共字符串SalesAgentInials
{
得到
{
返回
字符串格式(
"{0}.{1}.",
SalesAgent.FirstName.First(),
SalesAgent.LastName.First());
}
}
公共IEnumerable ApprovedTransactions
{
获取{return Transactions.Where(t=>t.Status.Status==“Approved”);}
}
公共IEnumerable PendingTransactions
{
获取{return Transactions.Where(t=>t.Status.Status==“Pending”);}
}
公共IEnumerable DeclinedTransactions
{
获取{返回事务。其中(t=>t.Status.Status==“已拒绝”);}
}
公共整数批准计数
{
获取{ApprovedTransactions.Count();}
}
公共整数挂起计数
{
获取{PendingTransactions.Count();}
}
公共整数DeclinedCount
{
获取{DeclinedTransactions.Count();}
}
公共整数总数
{
获取{return Transactions.Count;}
}
公共小数批准百分比
{
获取{返回(十进制)ApprovedCount/TotalCount}
}
公共小数挂起百分比
{
获取{返回(十进制)PendingCount/TotalCount}
}
公共十进制递减百分比
{
获取{返回(十进制)DeclinedCount/TotalCount}
}
公共十进制批准值
{
获取{return ApprovedTransactions.Select(t=>(十进制?)t.amonRequested.Sum()??0;}
}
公共十进制挂起值
{
获取{return PendingTransactions.Select(t=>(十进制?)t.amonRequested.Sum()??0;}
}
公共十进制DeclinedValue
{
获取{return DeclinedTransactions.Select(t=>(十进制?)t.amonRequested.Sum()??0;}
}
公共日期时间开始月
{
获取{returnnewdatetime(DateTime.Today.Year,DateTime.Today.Month,1);}
}
公共日期时间月末
{
获取{return StartMonth.AddMonths(1);}
}
公共国际日每月
{
获取{return(EndMonth-StartMonth.Days;}
}
公共int工作日FTINMONTH
{
得到
{
可枚举
.Range(DateTime.Today.Day,DaysInMonth)
.选择(d=>newdatetime(DateTime.Today.Year,DateTime.Today.Month,d))
.Count(日期=>
date.DayOfWeek!=DayOfWeek.周六&&
date.DayOfWeek!=DayOfWeek.Sunday);
}
}
公共十进制指定的总数
{
得到
{
返回
批准的交易
其中(t=>t.DateApproved>=StartMonth&&t.DateApproved(十进制?)t.AmountApproved)
.Sum()??0;
}
}
公共十进制运行率
{
获取{return Math.Round((MonthlyTarget-SpecifiedTotal)/WorkingDaysLeftInMonth,2);}
}
公共字符串运行速率格式
{
获取{return RunRate.ToString(“N0”);}
}
}
这简化了操作:

public ActionResult Index()
{
    var db = new ApplicationDbContext();    
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    var CurrentUser = manager.FindById(User.Identity.GetUserId());

    var loans =
        db.Transaction
          .Where(t =>
              t.AgentId == CurrentUser.SalesAgent.AgentId)
          .ToList();

    var salesAgent = 
        db.SalesAgent
          .FirstOrDefault(s => s.AgentId == CurrentUser.SalesAgent.AgentId);

    var viewModel = new TransactionViewModel(loans, salesAgent)

    return View(viewModel);
}
public ActionResult Index()
{
var db=new ApplicationDbContext();
var-manager=newusermanager(newuserstore(db));
var CurrentUser=manager.FindById(User.Identity.GetUserId());
风险值贷款=
db.交易
.其中(t=>
t、 AgentId==CurrentUser.SalesAgent.AgentId)
.ToList();
var salesAgent=
销售代理
.FirstOrDefault(s=>s.AgentId==CurrentUser.SalesAgent.AgentId);
var viewModel=新交易视图模型(贷款、销售代理)
返回视图(viewModel);
}

“我发现很难使用ViewModel”-嗯,你需要一个ViewModel。老实说,我同意@CodeCaster,我甚至想补充一点,你需要考虑
Index()
操作的绝对大小,以及它在当前形状中的可维护性。考虑一下你是如何设计你的域和相应的解决方案的。为什么你发现使用视图模型很困难?它们是专门为解决您的问题而创建的。您似乎混淆了域模型和视图模型。视图模型可以包含多个域模型,只应将其视为将必要数据从控制器传输到视图的一种机制。“因为我需要对查询结果执行大量计算,我发现很难使用视图模型。”这对我来说毫无意义。创建一个名为“IndexViewModel”的新类查找ViewBag并将其替换为“IndexViewModel”,让VS添加所有缺少的属性。你完成了。说“我发现很难使用ViewModel”就像说,“我知道正确的答案是什么,但我不想这么做。”:)我投票结束这个问题,因为它属于代码复查堆栈交换。这让我现在努力理解
public class TransactionViewModel
{
    public TransactionViewModel(
        List<Transaction> transactions,
        SalesAgent salesAgent)
    {
        Transactions = transactions;
        SalesAgent = salesAgent;
    }

    public List<Transaction> Transactions { get; set; }

    public SalesAgent SalesAgent { get; set; }

    public decimal MonthlyTarget
    {
        get { return (decimal) SalesAgent.MonthlyTarget; }
    }

    public string SalesAgentInitials
    {
        get
        {
            return
                string.Format(
                    "{0}.{1}.",
                    SalesAgent.FirstName.First(),
                    SalesAgent.LastName.First());
        }
    }

    public IEnumerable<Transaction> ApprovedTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Approved"); }
    }

    public IEnumerable<Transaction> PendingTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Pending"); }
    }

    public IEnumerable<Transaction> DeclinedTransactions
    {
        get { return Transactions.Where(t => t.Status.Status == "Declined"); }
    }

    public int ApprovedCount
    {
        get { ApprovedTransactions.Count(); }
    }

    public int PendingCount
    {
        get { PendingTransactions.Count(); }
    }

    public int DeclinedCount
    {
        get { DeclinedTransactions.Count(); }
    }

    public int TotalCount
    {
        get { return Transactions.Count; }
    }

    public decimal ApprovedPercent
    {
        get { return (decimal) ApprovedCount / TotalCount }
    }

    public decimal PendingPercent
    {
        get { return (decimal) PendingCount / TotalCount }
    }

    public decimal DeclinedPercent
    {
        get { return (decimal) DeclinedCount / TotalCount }
    }

    public decimal ApprovedValue
    {
        get { return ApprovedTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public decimal PendingValue
    {
        get { return PendingTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public decimal DeclinedValue
    {
        get { return DeclinedTransactions.Select(t => (decimal?)t.AmountRequested).Sum() ?? 0; }
    }

    public DateTime StartMonth
    {
        get { return new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); }
    }

    public DateTime EndMonth
    {
        get { return StartMonth.AddMonths(1); }
    }

    public int DaysInMonth
    {
        get { return (EndMonth - StartMonth).Days; }
    }

    public int WorkingDaysLeftInMonth
    {
        get
        {
            Enumerable
                .Range(DateTime.Today.Day, DaysInMonth)
                .Select(d => new DateTime(DateTime.Today.Year, DateTime.Today.Month, d))
                .Count(date =>
                    date.DayOfWeek != DayOfWeek.Saturday &&
                    date.DayOfWeek != DayOfWeek.Sunday);
        }
    }

    public decimal SpecifiedTotal
    {
        get
        {
            return
                ApprovedTransactions
                    .Where(t => t.DateApproved >= StartMonth && t.DateApproved < EndMonth)
                    .Select(t => (decimal?) t.AmountApproved)
                    .Sum() ?? 0;
        }
    }

    public decimal RunRate
    {
        get { return Math.Round((MonthlyTarget - SpecifiedTotal) / WorkingDaysLeftInMonth, 2); }
    }

    public string RunRateFormat
    {
        get { return RunRate.ToString("N0"); }
    }
}
public ActionResult Index()
{
    var db = new ApplicationDbContext();    
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    var CurrentUser = manager.FindById(User.Identity.GetUserId());

    var loans =
        db.Transaction
          .Where(t =>
              t.AgentId == CurrentUser.SalesAgent.AgentId)
          .ToList();

    var salesAgent = 
        db.SalesAgent
          .FirstOrDefault(s => s.AgentId == CurrentUser.SalesAgent.AgentId);

    var viewModel = new TransactionViewModel(loans, salesAgent)

    return View(viewModel);
}