访问 MVC 应用程序中分部视图中的信息

本文关键字:视图 信息 MVC 应用程序 访问 | 更新日期: 2023-09-27 18:36:10

我正在编写一个基于 C# 的 MVC Web 应用程序,它显示信息的类别和子类别。

因此,我有一个与自身相关的子类别的类别表的数据库设置 - 这一切都与实体框架挂钩,并且运行良好。

我正在努力解决的是如何实现权限系统 - 我可以使用 ViewBag 轻松做到这一点,但我想知道这是否是一种"正确"的方法。

我有一个看起来像这样的视图:

@using Secure_Password_Repository.Utilities;
@using Secure_Password_Repository.Settings;
@using Secure_Password_Repository.ViewModels;
@model Secure_Password_Repository.ViewModels.CategoryDisplayItem
<ul id="roottree" class="treeview ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion ui-widget ui-sortable ui-accordion-content-active">
    <li class="treeignore treeview ui-accordion ui-widget ui-helper-reset ui-sortable" data-id="0">
    <div><i class="glyphicon glyphicon-folder-open rightfolderpadding"></i>Root</div>
    <ul class="treeview ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion ui-widget ui-sortable ui-accordion-content-active" id="parent-1">
        @foreach (var categoryitem in Model.categoryListItem.SubCategories)
        {
        @Html.Partial("_CategoryItem", categoryitem)
        }
        @if (Model.CanAddCategories)
        {
        @Html.Partial("_CreateCategory", Model.categoryAddItem)
        }
    </ul>
    </li>
</ul>

CategorDisplayItem 模型如下所示:

public class CategoryDisplayItem
{
    public CategoryItem categoryListItem { get; set; }
    public CategoryAdd categoryAddItem { get; set; }
    public PasswordAdd passwordAddItem { get; set; }
    public bool CanAddCategories { get; set; }
    public bool CanEditCategories { get; set; }
}
public class CategoryItem : CategoryEdit
{
    [Required]
    public Int32 Category_ParentID { get; set; }
    public virtual ICollection<CategoryItem> SubCategories { get; set; }
    public virtual ICollection<PasswordItem> Passwords { get; set; }
    public bool CanEditCategory { get; set; }
    public bool CanDeleteCategory { get; set; }
}
public class CategoryEdit
{
    public Int32? CategoryId { get; set; }
    [Required]
    public string CategoryName { get; set; }
}

我遇到的问题是如何为 CategoryItem 视图模型设置 CanEditCategory 和 CanDeleteCategory 属性。权限不是按类别设置的,而是全局设置的,即如果我的帐户有权编辑类别,则它有权编辑所有类别。

类别项模型填充视图实体框架:

        Category ReturnCategoryItem = DatabaseContext.Categories
                                        .Where(c => c.CategoryId == categoryid)
                                        .Include(c => c.SubCategories)
                                        .Include(c => c.Passwords)
                                        .Include(c => c.Passwords.Select(p => p.Creator))
                                        .ToList()
                                        .Select(c => new Category()
                                        {
                                            SubCategories = c.SubCategories
                                                                //make sure only undeleted subcategories are returned
                                                                .Where(sub => !sub.Deleted)
                                                                .OrderBy(sub => sub.CategoryOrder)
                                                                .ToList(),
                                            Passwords = c.Passwords
                                                                //make sure only undeleted passwords - that the current user has acccess to - are returned
                                                                .Where(pass => !pass.Deleted && PermissionService.CanViewPassword(pass)) 
                                                                .OrderBy(pass => pass.PasswordOrder)
                                                                .ToList(),
                                            CategoryId = c.CategoryId,
                                            CategoryName = c.CategoryName,
                                            Category_ParentID = c.Category_ParentID,
                                            CategoryOrder = c.CategoryOrder,
                                            Parent_Category = c.Parent_Category,
                                            Deleted = c.Deleted
                                        })
                                        .SingleOrDefault();
子类别"类别

"列表被隐式转换为"类别项"列表。那么,我将如何设置CanEditCategories和CanDeleteCategories属性呢?

就像我说的,我可以使用ViewBag...但我读到的一切都说使用 ViewBag 是不好的。

访问 MVC 应用程序中分部视图中的信息

如果这些属性对于每个用户都是唯一的,则可以将这些属性添加到您的 Identity,然后在视图中像这样使用它们:

在视图 cshtml 文件的顶部:

@using Microsoft.AspNet.Identity

然后使用以下语法访问您的用户名:

@if (@User.Identity.CanAddCategories())
{
  @Html.Partial("_CreateCategory", Model.categoryAddItem)
}