簡體   English   中英

Asp.Net Core 視圖 - 最佳實踐

[英]Asp.Net Core Views - best practices

我正在開發一個在線商店網站,它將包含一組默認功能,如產品頁面、產品類別、評論、個人購物車等。這是我第一次做這樣的項目,在實現功能的過程中我遇到了一些在視圖中處理不同異常的困難。 因此,我想了解在將來可擴展的視圖中設計好的代碼的最佳實踐。

假設我有一個帶有類別操作的商店 controller,它顯示與我們所在類別相關的產品列表。在相應的類別視圖中,我需要遍歷產品列表並根據用戶的角色和授權(管理員、用戶、訪客)隱藏一些非活性產品。 我現在這樣做的方式是這樣的(代碼已簡化):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM