我在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-->
}
现在,我的观点有很多像以前那样的条件。视图模型如何帮助我减少视图的代码,因此它不包含if
和foreach
块形式的逻辑?
答案 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)
这样,您将分别处理每个部分的演变......并且很可能您的复杂视图的每个部分变化较小。