1

我目前正在做一个小而简单的项目。我有一个存储在数据库中的用户列表,如下所示:Id(唯一标识符主键),FirstName(varchar),LastName(varchar),PhoneNo(varchar),DomainAC(varchar)

我在这样的网页上显示他们的信息:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<WhoIs.Models.Employee>>" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>
        <%: Html.ActionLink("Create New", "Create") %>
    </p>
    <table>
        <tr>
            <th>
                <%: Html.DisplayNameFor(model => model.FullName) %>
            </th>
            <th>
                <%: Html.DisplayNameFor(model => model.PhoneNo) %>
            </th>
            <th>
                <%: Html.DisplayNameFor(model => model.DomainAC) %>
            </th>
            <th>
                <%: Html.DisplayNameFor(model => model.Branch) %>
            </th>
            <th></th>
        </tr>

    <% foreach (var item in Model) { %>
        <tr>
            <td>
                <%: Html.DisplayFor(modelItem => item.FullName) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.PhoneNo) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.DomainAC) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.Branch) %>
            </td>
            <td>
                <% if (User.IsInRole(@"Admin") || User.Identity.Name == item.DomainAC) {%>
                    <%: Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
                    <%: Html.ActionLink("Delete", "Delete", new { id=item.Id }) %>
                <% } %>
            </td>

        </tr>
    <% } %>

    </table>
</body>
</html>

这工作正常,它会抛出一个用户的小网页,并在他们旁边显示 3 个毫无意义的链接 - 但我不确定从这里去哪里 - 我如何使这些链接尽可能简单/有效地工作?

我想要的功能很简单

if(DomainAC == currently logged in Domain AC || currently logged in Domain AC is admin)
    Allow user to edit/update details.
else 
{
user is normal, no buttons/actions - just display the list.
}

谁能简单地向我解释一下我需要做些什么来完成这项工作?我之前发布了一个与此类似的问题,它真的让我头疼 - 谈论 ActionControllers 等,没有解释它们在你的项目中的位置/它们如何链接在一起/如何使用它们。

任何人都可以帮我解决这个问题吗?我将在两天内对此进行小额赏金并将其授予最佳答案,因为这是最近对我来说经常出现的事情!谢谢你。

4

4 回答 4

2

那么答案并不复杂,只取决于你想如何实现它。(我假设您正在使用 MVC,因为其中一些是如何实现的以及您如何标记它)

在控制器中,您需要确定用户是否已登录以及该数据。好吧,假设你有那个

 public ActionResult LoadUserData(){
     var model = new LoadUserDataModel();

     // code here to populate your model

     var isUserAuthenticated = MethodToFigureOutIfUserIsAuthenticated(); // returns bool

     ViewBag.isUserAuthenticated = isUserAuthenticated; // I don't like using the ViewBag so you can add this to the model if you wish.

     return View(model);
 }

不会撒谎,对于那些看着这个的专家来说,他们可能有点吓坏了。我明白。方法属性会更有效,但我想帮助这里的人。

好的,现在在视图上(我只是复制了你的并做了一些调整)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<WhoIs.Models.Employee>>" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
<% if (ViewBag.isUserAuthenticated) {%>
<p>
    <%: Html.ActionLink("Create New", "Create") %>
</p>
<% } %>
<table>
    <tr>
        <th>
            <%: Html.DisplayNameFor(model => model.FullName) %>
        </th>
        <th>
            <%: Html.DisplayNameFor(model => model.PhoneNo) %>
        </th>
        <th>
            <%: Html.DisplayNameFor(model => model.DomainAC) %>
        </th>
        <th>
            <%: Html.DisplayNameFor(model => model.Branch) %>
        </th>
        <th></th>
    </tr>

<% foreach (var item in Model) { %>
    <tr>
        <td>
            <%: Html.DisplayFor(modelItem => item.FullName) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.PhoneNo) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.DomainAC) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.Branch) %>
        </td>
        <td>
            <% if (ViewBag.isUserAuthenticated) {%>
                <%: Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
                <%: Html.ActionLink("Delete", "Delete", new { id=item.Id }) %>
            <% } %>
        </td>

    </tr>
<% } %>

</table>
</body>
</html>

那......应该适合你。

所以回到你问题的另一部分。你想知道所有这些是如何联系在一起的。在一个简单的问答论坛中,这个答案很难回答。所以...我将简要概述角色是什么。

MVC 代表模型/视图/控制器。它是一种将应用程序开发的关注点分开的编程方法。基本上,控制器是应用程序的数据/getter/grabber/saver。对商业应用程序开发有一个完整的理解水平,这是在一所主要大学不到 4 年的时间里无法解释的,但可以说这是你的应用程序的主要内容。视图是应用程序的呈现。也称为用户界面。该部分控制应用程序的用户输入和应用程序的实际操作。模型是将它们联系在一起的粘合剂。控制器将抓取填充模型所需的数据,然后将模型传递给视图,然后视图将使用它。

为什么这是必要的?如果您想开发可维护的应用程序和可重用的代码,它不仅是必要的,而且是绝对必要的。但这也是 MVC 的美妙之处。

我希望这回答了你的问题。如果您需要更多说明,请告诉我,我会相应地更新我的答案。

我还建议你访问这个网站http://www.asp.net/mvc并向右看,你会看到一个部分说 Pluralsight 和一个关于 MVC4 的网络系列。当我开始使用 MVC 时,我发现它最有帮助。

于 2013-07-18T02:00:36.570 回答
1

您可以在控制器本身中检查用户角色权限,基于此您可以将响应重定向到网页。

你有两页列出所有用户,另一页有创建按钮。在基于用户角色的控制器中,您可以将响应重定向到相关页面。

于 2013-07-29T03:13:36.790 回答
0

这可以通过两种方式处理。

  1. 在模型中获取一个布尔类型属性,例如:IsUserAuthenticated 并从控制器设置它的值,即 True 或 false。现在,当您进入视图时,放置 if-else 块以检查用户是否已通过身份验证。如果值为 true,则显示编辑/删除按钮。

  2. 您可以为此使用 ViewBag。在控制器 ex 中创建一个动态属性:ViewBag.IsUserAuthenticated 并将其值设置为 True 或 false。现在将 if-else 块放在视图中。

于 2013-07-29T07:14:23.017 回答
0

最简单、最可扩展和可维护的方法是在IPrincipal Interface上使用扩展方法。

但是,您的问题中似乎有相互矛盾的信息

if (User.IsInRole(@"Admin") || User.Identity.Name == item.DomainAC)

好像不是同一个逻辑

if(DomainAC == 当前登录域 AC || 当前登录域 AC 是管理员)

所以我不确定这段代码是你想要的。

WebViewPage 可以通过WebPageRenderingBase.User作为IPrincipal.

namespace MyProject.<whatever>
{
  public static IPrincipalExtensions
  {
    public bool IsAdminOrDomainAC(this IPrincipal instance, string name)
    {
      if (instance == null
        || instance.Identity == null
        || !instance.Identity.IsAuthenticated)
      {
        return false;
      }

      return instance.IsInRole(@"Admin")
        || instance.Identity.Name == name;
    }
  }
}

现在您的视图代码如下所示:

 <td>
   <% if this.User.IsAdminOrDomainAc(item.DomainAC) {%>
     <%: Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
     <%: Html.ActionLink("Delete", "Delete", new { id=item.Id }) %>
   <% } %>
 </td>

您甚至可以编辑Views目录中的 web.config 文件并添加

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyProject.<whatever>" />

使扩展方法可用于视图文件夹中的所有视图,而不使用using MyProject.<whatever>每个视图顶部的 。

这假设您要返回多条记录,并且用户只能编辑/删除其中一些记录。您还需要确保在您的编辑/删除方法中加载的项目用户可以访问。因为它是 IPrincipal 上的扩展方法,它也可以在控制器中使用,从而为您提供一个单一的、可维护的逻辑位置。

using MyProject.<whatever>

public class MyController
{
  public ActionResult Edit(int id)
  {
    var item= DB.GetRow(id) //whatever that looks like    

    if (!this.User.IsAdminOrDomainAc(item.DomainAC))
    {
      return this.RedirecToAction("Index");
    }

    return this.View(item);
  }
于 2013-07-29T08:56:45.333 回答