基于属性的自定义视图

时间:2015-05-25 23:32:32

标签: c# asp.net-mvc attributes asp.net-mvc-5

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

我知道可以为控制器中的 Action 定义[attribute]形式的属性。但是假设在我的索引视图中,我想要显示" 产品"的所有字段。模型给管理员(例如名称,价格,数量),并且仅向客户提供其中的一些字段(例如,仅名称和价格)。

如何编辑我的

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

实现这个目标?

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

1 个答案:

答案 0 :(得分:0)

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

您可以使用Attribute和ChildActions在没有Html.Partial的情况下执行此操作。当然这是一项工作,需要另外两个部分才能维持......

示例:

产品视图您要显示表格的位置。

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

这样做可以使您的角色检查逻辑不受您的影响。