如何解决Asp.Net 核心视图 - 最佳实践 更新
我正在开发一个在线商店网站,其中将包含一组默认功能,如产品页面、产品类别、评论、个人购物车等。 这是我第一次做这样的项目,在实现功能的过程中,我在处理视图中的不同异常时遇到了一些困难。因此,我想了解在未来可扩展的视图中设计良好代码的最佳实践。
假设我有一个带有 Category 操作的 Shop 控制器,它显示与我们所在类别相关的产品列表。在相应的类别视图中,我需要遍历产品列表并根据用户的角色和授权(管理员、用户、访客) ) 隐藏一些不活跃的产品。我现在的做法是这样的(代码已简化):
@model ProductList
@foreach (var i in Model) {
@if (i.Product.Active || UserManager.IsInRole(User,"Admin")) {
<div class="product">
@if (i.Data.Path == null) {
<img src="placeholder.png">
}
else {
<img src="@i.Data.Path">
}
...
</div>
}
}
虽然直观上看起来很清楚,但我意识到一旦我添加更多条件分支,这迟早会变得非常混乱。所以我的问题是:有没有其他方法来处理此类异常分支?我听说过自定义 HtmlTagHelpers(它可以使代码看起来更像 HTML,同时保留一些条件逻辑),但看起来为每个异常显式编写逻辑需要更多时间。
先谢谢你!
解决方法
视图不能包含数据逻辑,你所有的数据逻辑都必须在后端,对于你的情况,把逻辑放在你查询产品的地方。例如:
public async Task<IActionResult> Index()
{
var query = UserManger.IsInRole(User,"Admins")
? _context.Set<Products>()
: _context.Set<Products>().Where(x => x.IsActive == false);
Products = await query.Skip(/*number*/).Take(/*quantity*/).ToListAsync();
// ...
}
更新
正如评论中提到的,视图逻辑可以发生在视图内部,例如:
@if(!Product.IsInStock)
{
<span class="text-danger">Not Available</span>
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。