【问题标题】:Asp.Net Core Views - best practicesAsp.Net 核心视图 - 最佳实践
【发布时间】:2021-04-12 10:41:22
【问题描述】:

我正在开发一个在线商店网站,其中包含一组默认功能,如产品页面、产品类别、评论、个人购物车等。 这是我第一次做这样的项目,在实现功能的过程中,我在处理视图中的不同异常时遇到了一些困难。因此,我想了解在 Views 中设计好的代码的最佳实践,这些代码将来可以扩展。

假设我有一个带有 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,同时保留一些条件逻辑),但看起来为每个异常显式编写逻辑需要更多时间。

提前谢谢你!

【问题讨论】:

  • 我认为使用 .Net 的 MVVM 的最佳实践不是一个好的选择。一般来说,您的前端不应与后端耦合。改用 WebApi 可能会更好

标签: c# asp.net-core asp.net-mvc-views


【解决方案1】:

视图不得包含数据逻辑,您的所有数据逻辑都必须在后端,并且对于您的情况,将逻辑放在您查询产品的地方。例如:

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>
}

【讨论】:

  • 这很有道理,以前想不到这种方法。谢谢!只是一个问题,如果我有条件(如果 model.InStock)应该根据变量显示不同的 html 怎么办?我应该将其保留在 View 中吗?
  • 是的,视图逻辑可以发生在视图中 :) 查看更新的答案。
  • @LazZiya 视图逻辑可以发生在那里,但一般你不应该把它放在那里,因为重构模板逻辑会让人头疼
  • @johnny5 你是对的,但对于给定示例中的简单情况,这不是问题。无论如何,Html 助手、部分视图、视图组件和剃须刀组件都是为了简化更复杂的场景。
  • @LazZiya 是的,作为一个整体的技术,它使开发以一种语言进行,但是你会牺牲大量的服务器资源来产生这些视图
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 2014-04-11
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多