基于属性的定制视图

本文关键字:视图 属性 于属性 | 更新日期: 2023-09-27 17:50:45

我正在尝试使用MVC5为产品模型生成表视图。

我知道可以为控制器中的Action定义[attribute]形式的属性。但是假设在我的Index视图中,我想向管理员显示"Product"模型的所有字段(例如名称、价格、数量),而只向客户显示其中的一些字段(例如只有名称和价格)。

如何编辑我的

 public ActionResult Index()
        {
            return View(db.Products.ToList());
        }

来实现这个?

更新:我的问题是我是否需要创建多个视图,或者我必须以某种方式自定义Index() Action内部的视图?

基于属性的定制视图

虽然这不是您的神奇解决方案,但它会起作用。

您可以通过使用Html.Partial和ChildActions来实现没有Attribute的情况。当然,这是一点工作,确实需要2个部分来维护…

的例子:

产品视图,您希望在其中显示表格。

@Html.Action("BuildProductTable", "Products")

产品控制器
public class ProductsController : Controller
{
    // other methods removed
    // ...
    [ChildActionOnly]
    public ActionResult BuildProductTable()
    {
        if (User.IsInRole("Admin"))
        {
            // Return Admin ViewModel & Partial View
            // Create and populate Admin ViewModel here
            return PartialView("_AdminProductTable", ProductsAdminVM);
        } 
        // Create and populate Customer ViewModel here
        return PartialView("_CustomerProductTable", ProductsCustomerVM );
    }
}

然后您可以创建两个部分视图,使用传递给它的ViewModel以您想要的方式显示表和您想要的列。

客户产品表部分视图

@model YourProject.Web.Models.ProductsCustomerVM
 <table>
  <tr>
    <th>Column 1</th>
    <th>Column 2</th>
  </tr>
  <tr>
    <td>data..</td>
    <td>data..</td>
  </tr>
</table> 

管理产品表部分视图

@model YourProject.Web.Models.ProductsAdminVM
 <table>
  <tr>
    <th>Column 1</th>
    <th>Column 2</th>
    <th>Column 3</th>
    <th>Column 4</th>
  </tr>
  <tr>
    <td>data..</td>
    <td>data..</td>
    <td>data..</td>
    <td>data..</td>
  </tr>
</table> 

这样做可以使你的角色检查逻辑脱离你的视图。