ViewModels如何减少视图中的代码和逻辑?

时间:2014-12-11 17:39:25

标签: c# asp.net-mvc razor

我在MVC5中有一个使用C#和Razor Engine的项目。

我的一个观点是巨大的,有数百行代码,因此很难管理。 在之前的帖子中,这个社区建议我应该从我的View中删除逻辑并使用ViewModel来代替逻辑。

然而,我没有看到这对我有何帮助。我的视图根据谁看到它显示不同的信息:

if ((User.isHelpDesk && Model.MaterialStatusId == MatStatus.A1HelpDeskProductProposal) || (User.isProcurement && Model.MaterialStatusId == MatStatus.A4PurchasingDptValidation))
{
    <!-- Show something here -->
}
else if (User.isHelpDesk || User.isProcurement || User.isDirector || User.isManager)
{
    <!-- Show some other thing here-->
}

现在,我的观点有很多像以前那样的条件。视图模型如何帮助我减少视图的代码,因此它不包含ifforeach块形式的逻辑?

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

public class MyViewModel
{
    public User User { get; set; }
    public OtherModel Model { get; set; }
    public bool IsSomethingHere
    {
        get
        {
            return (User.isHelpDesk && Model.MaterialStatusId == MatStatus.A1HelpDeskProductProposal) ||
                (User.isProcurement && Model.MaterialStatusId == MatStatus.A4PurchasingDptValidation);
        }
    }
    public bool IsSomethingElseHere
    {
        get
        {
            return User.isHelpDesk || User.isProcurement || User.isDirector || User.isManager;
        }
    }
}

查看模型对于聚合数据和条件非常有用。您可以为其提供有意义的属性名称,以便在视图中轻松跟踪。

答案 1 :(得分:1)

添加@Beautifulcoder答案...通常在控制器操作中加载ViewModel。在那里,您可以进行所有计算,使您的视图只需要显示传递给它的内容。

除了使用ViewModel之外,您还可以在视图中使用这个复杂的逻辑,但每个“IF”块中的标记可以放在局部视图中,并像这样调用它:

@Html.Partial("PartialName", Model)

这样,您将分别处理每个部分的演变......并且很可能您的复杂视图的每个部分变化较小。