简体   繁体   English

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

[英]Accessing information in a partial view in an MVC application

I'm writting a C# based MVC web application, that displays categories and subcategories of information. 我正在编写一个基于C#的MVC Web应用程序,该应用程序显示信息的类别和子类别。

So, I have the database setup with a Category Table, which relates to itself, for sub categories - this is all hooked up with Entity Framework, and works perfectly. 因此,我为数据库设置了一个与类别表相关的类别表,该类别表与自身相关,属于子类别-所有这些都与Entity Framework挂钩,并且运行良好。

What I'm struggling with, is how to implement a permission system - I can do this quite easily using ViewBag, but I'm wondering if the is a "proper" way to do this. 我正在努力的是如何实现权限系统-我可以使用ViewBag轻松地做到这一点,但是我想知道这是否是“正确”的方法。

I have a view that looks like this: 我有一个看起来像这样的视图:

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

The CategorDisplayItem Model looks like this: 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; }
}

The issue I'm havingm is how to set the CanEditCategory and CanDeleteCategory property for the CategoryItem view model. 我遇到的问题是如何为CategoryItem视图模型设置CanEditCategory和CanDeleteCategory属性。 The permission is not set per category, it is set globally ie if my account has permission to edit categories, it has access to edit all categories. 权限不是按类别设置的,而是全局设置的,即,如果我的帐户具有编辑类别的权限,则它有权编辑所有类别。

The CategoryItem model is populated view Entity Framework: CategoryItem模型是填充视图实体框架:

        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();

The SubCategories "Category" list gets casted to a "CategoryItem" list implicitly. 子类别“类别”列表将隐式转换为“ CategoryItem”列表。 So how would I set the CanEditCategories and CanDeleteCategories property? 那么我将如何设置CanEditCategories和CanDeleteCategories属性?

Like I say, I could just use the ViewBag... but everything I read says that using the ViewBag is bad. 就像我说的,我可以只使用ViewBag ...,但是我读到的所有内容都表明使用ViewBag是不好的。

If these are properties that are unique to each user, you can add those properties to your Identity, then use them like this in your view: 如果这些是每个用户唯一的属性,则可以将这些属性添加到您的Identity中,然后在视图中像这样使用它们:

At the top of your view cshtml file: 在您的视图cshtml文件的顶部:

@using Microsoft.AspNet.Identity

Then access your User Name using the following syntax: 然后使用以下语法访问您的用户名:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM