Рендеринг содержимого HTML в соответствии с ролью пользователя? - PullRequest
0 голосов
/ 14 декабря 2018

Например: мне нужно две роли в моем приложении.

1.Administrator // Может выполнять все операции CRUD с данными.

2.Customer // Может только читать существующиеdata.

В случае возврата представления пользователю в соответствии с его ролью?Теперь у меня есть выбор: создать два отдельных представления в соответствии с ролями.

Давайте посмотрим код.

public ActionResult Index()
{
    var customers = _dbContext.Customers.Include(c => c.Type).ToList();
    if (User.IsInRole(userRole.IsAdministator))
    {
        return View("Admin_List_View", customers);
    } else
    {
        return View("Customer_ReadOnlyList_View" , customers);
    }
}

В приведенном выше коде. У меня два представления.

1.Admin_List_View // Это представление содержит все данные вместе с опциями Добавить, Удалить, Обновить, Изменить.

2.Customer_ReadOnly_View // Это представление будет содержать только список только для чтения.

Так что мой вопросзаключается в следующем: в случае простого представления я должен следовать этому подходу, написав отдельное представление для целевых ролей.

Но как возможно иметь одно представление и назначить конкретный раздел этого для конкретной роли?

Примечание: Я задаю этот вопрос: в случае сложного представления у меня нет выбора, чтобы создать другое представление с нуля для определенной роли.Поэтому мне интересно, есть ли способ поиграть с существующим видом.

Например: Мне нужны роли.

Администратор и клиент

и

у меня есть одно представление.

Как управлять этим одним представлением для этих ролей?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Более подробный ответ:

public ActionResult Index()
{
    var customers = _dbContext.Customers.Include(c => c.Type).ToList();
    if (User.IsInRole(userRole.IsAdministator))
    {
        return View("Admin_List_View", customers);
    } else
    {
        return View("Customer_ReadOnlyList_View" , customers);
    }
}

В приведенном выше примере.когда есть две роли, и обе роли имеют специфическое представление.

1. Один из способов:

, чтобы создать два представления для отдельной роли для приведенного выше примера: я создалдва представления

  • 1.Admin_List_View
  • 2.Customer_ReadOnlyList

2,2-й способ:

досоздать образец представления и назначить html-содержимое на основе роли пользователя.

Например:

Мне нужно роли:

снова я скажу, что:

1.AdminList 2.CustomerList.

, и теперь у меня есть только одно представление: index.cshtml

index.cshmtl

@model IEnumerable<Vidly.Models.Customer>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}


<h2 id="heading">Customers</h2>

// This Button is accessible to only admin.
@Html.ActionLink("Add New Customer" , "Add" , "Customer" )

@if (Model.Count() == 0)
{
    <p>No Customer is found.</p>
}
else
{
    <table id="customers" class="table table-bordered table-hover">
        <thead>
            <tr>
                <th>Full Name</th>
                <th>Email Address</th>
                <th>Physical Addrses</th>
                <th>Type</th>

                     <th>Actions</th>   // This Column will be only accessible to 
 admin role.

               }
            </tr>
        </thead>
        @foreach (var item in Model)
        {
            <tbody>
                <tr>
                    <td>@item.FullName</td>
                    <td>@item.EmailAddress</td>
                    <td>@item.PhysicalAddress</td>
                    <td>@item.Type.TypeName</td>


                     // These Button will be only accessible to Admin 

                     // This is the Edit Button.
                    <td><button data-customer-id="@item.Id" class="btn btn-link js-delete">Edit</button></td>

                     // This is the Delete Button.
      <td><button data-customer-id="@item.Id" class="btn btn-link js-delete">Delete</button></td>





                </tr>
            </tbody>
        }
    </table>
}

@section Scripts{
    <script type="text/javascript">
        $(document).ready(function () {
            $("#customers").DataTable();
            $("#customers").on("click", ".js-delete", function () {
                var button = $(this);
                var result = confirm("Are you sure you want to delete this customer?");
                    function (result) {
                    if (result) {
                        $.ajax({
                            url: "/api/customers/" + button.attr("data-customer-id"),
                            method: "Delete",
                            success: function () {
                                button.parents("tr").remove();
                            },
                            error: function (xhr) {
                                alert("Something goes wrong." + " " + " Error Details " + xhr.status);
                            }

                        });
                    }
                });
            });
        });
    </script>
}

Итак, это весь вид.

Теперь назначаем конкретный контент для конкретной роли:

@model IEnumerable<Vidly.Models.Customer>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}


<h2 id="heading">Customers</h2>

@if(User.IsRole("Admin")) // Checking that if the LoggedIn User is Admin or Not? if The User is Admin Dispay this "Add New Customer Link" Otherwise don't display it.
{

// This Button is accessible to only admin.
@Html.ActionLink("Add New Customer" , "Add" , "Customer" )


}

@if (Model.Count() == 0)
{
    <p>No Customer is found.</p>
}
else
{
    <table id="customers" class="table table-bordered table-hover">
        <thead>
            <tr>
                <th>Full Name</th>
                <th>Email Address</th>
                <th>Physical Addrses</th>
                <th>Type</th>

                @if(User.IsRole("Admin")) // Again Checking That the User is Admin or not? if the User admin Display the table Header otherwise don't display it.
                {

                     <th>Actions</th>   // This Column will be only accessible to admin role.

               }
            </tr>
        </thead>
        @foreach (var item in Model)
        {
            <tbody>
                <tr>
                    <td>@item.FullName</td>
                    <td>@item.EmailAddress</td>
                    <td>@item.PhysicalAddress</td>
                    <td>@item.Type.TypeName</td>


                    @if(User.IsRole("Admin")) // Checking that the LoggedIn User is Admin or Not. If the User is Admin the Display these buttons otherwise don't Display it.
                    {

                         // These Button will be only accessible to Admin 

                         // This is the Edit Button.
                        <td><button data-customer-id="@item.Id" class="btn btn-link 
js-delete">Edit</button></td>

                         // This is the Delete Button.
                        <td><button data-customer-id="@item.Id" class="btn btn-link 
js-delete">Delete</button></td>


                   }

                </tr>
            </tbody>
        }
    </table>
}

@section Scripts{
    <script type="text/javascript">
        $(document).ready(function () {
            $("#customers").DataTable();
            $("#customers").on("click", ".js-delete", function () {
                var button = $(this);
                var result = confirm("Are you sure you want to delete this customer?");
                    function (result) {
                    if (result) {
                        $.ajax({
                            url: "/api/customers/" + button.attr("data-customer-id"),
                            method: "Delete",
                            success: function () {
                                button.parents("tr").remove();
                            },
                            error: function (xhr) {
                                alert("Something goes wrong." + " " + " Error Details " + xhr.status);
                            }

                        });
                    }
                });
            });
        });
    </script>
}
0 голосов
/ 14 декабря 2018

Возможно ли иметь одно представление и назначить определенный раздел этого специфической роли?

Да.Вы можете достичь этого с помощью синтаксиса Razor, который позволяет использовать C # в вашем HTML.Префикс ваших операторов C # с "@".См. здесь .

В вашем представлении:

<button>Do Regular User Stuff</button>
@if(User.IsInRole("Admin") {
    <button>Do Admin Stuff</button>
}
...