【问题标题】:Displaying different view to a differ user based on the value from the database根据数据库中的值向不同的用户显示不同的视图
【发布时间】:2014-12-18 08:05:08
【问题描述】:

我正在开发一个 Asp.Net MVC 应用程序,用户可以使用具有两种不同角色的淘汰 JS 和 Odata 登录并查看从数据库中检索到的数据,一个可以添加、编辑和删除数据,另一个只是读取数据.

例如,我从 SQl 表中拉出三个字段到网页公司、产品和价格

管理员视图如下

    <td data-bind="text: Company"></td>
    <td data-bind="text: Product"></td>
    <td data-bind="text: Price"></td>
<td class="actioncells">

        <a class="btn btn-success" title="Edit" data-bind="click: $root.edit">Edit</a> 
</td>
<td class="actioncells">

        <a class="btn btn-success" title="Edit" data-bind="click: $root.delete">Del</a> 
</td>

客户视图(只读)

 <td data-bind="text: Company"></td>
    <td data-bind="text: Product"></td>
    <td data-bind="text: Price"></td>

家庭控制器

 [Authorize]
        public ActionResult Index()
        {
            return View();
        }

 [Authorize(Roles = "Admin")]
        public ActionResult Admin()
        {

            return View();
        }

以上工作正常,但我让每个用户都与一家公司相关联,我想显示一个视图,以便无论他担任什么角色,但他仍然应该能够编辑和删除他所关联的公司的数据。我不知道如何处理它,我在不同的表中有以下数据

用户资料

UserId UserName
1      demo_admin
2      test
3      sample 

公司

Id CName
1  XCorp
2  YCorp
3  ZCorp

用户公司

Id  CompanyId UserId
1    2         3
2    3         2 

Data_Items

Id  CompanyID  CompanyName Price
1    2          XCorp      100
2    3          ZCorp       58
2    3          ZCorp       75

根据来自不同表的上述数据,我假设用户demo_adminadmintestsample 用户分别为与ZCorpYCorp 关联的客户。 因此,在用户登录时的输出页面上demo_admin 应该能够editdelete 用户testsample 应该能够editdelete @987654341 的所有日期@ 和YCorp 数据,只能查看剩余数据,即XCorp

【问题讨论】:

    标签: c# asp.net-mvc html knockout.js sql-server-2012


    【解决方案1】:

    实现这一目标的最简单方法是通过两个工具,

    1. 确保保护您的编辑。确保在允许编辑之前要求用户有足够的权限进行编辑(不要假设您的用户不会弄清楚您的 uri 结构并发布顽皮的请求)
    2. 使用Knockout templating 例如:http://jsfiddle.net/jqtof6ju/

      <h2>non admin view</h2>
      <div data-bind="template: { name: 'edit-disabled' }"></div>
      
      <h2>admin view</h2>
      <div data-bind="template: { name: 'edit-enabled' }"></div>
      
      
      <script type="text/html" id="edit-enabled">
          <input data-bind="value: data"></input>
      </script>
      
      <script type="text/html" id="edit-disabled">
          <div data-bind="text: data"></div>
      </script>
      

    您实现目标的最佳方式是通过Knockout components。这将是一种更好的方法,因为您可以使用诸如 require.js 之类的东西来仅加载您需要的东西。或者更好的是,如果您不想使用诸如 requrie.js 之类的东西,您可以只使用 razor if 语句来更改组件的定义,以便它会发送管理员的定义或非管理员的定义。

    组件很酷,因为它允许您定义类似

    的东西
    ko.components.register('like-or-dislike', {
        viewModel: { require: 'files/component-like-widget' },
        template: { require: 'text!files/component-like-widget.html' }
    });
    

    然后,当您想重复使用此编辑字段时,您只需使用:

    <like-or-dislike></like-or-dislike>
    

    希望这会有所帮助:)。

    编辑:

    也许这样会更好:

    <h2>Company Data</h2>
    <div data-bind="template: { name: 'company-data' }"></div>
    
    
    <!-- if the user is logged in and has write for this company, send this down -->
    <script type="text/html" id="edit-enabled">
        <input data-bind="value: data"></input>
    </script>
    <!-- END -->
    
    
    <!-- if the user ints logged in or doesnt have write for this company, send this down -->
    <script type="text/html" id="edit-disabled">
        <div data-bind="text: data"></div>
    </script>
    <!-- END -->
    

    【讨论】:

    • 嗯,你发布的答案已经在我的问题中实现了。我能够为管理员和非管理员实施授权,当用户首先登录时,它应该查找他关联的公司,然后允许他编辑拥有他的公司的条目并且可以查看其他数据。这是我已经发布的问题
    • 您要做的就是检查授权用户对哪些公司具有写入权限并发送正确的表格...也许您可以将模板命名为 company-data 而不是启用、禁用如果 MVC razer 视图被告知,则仅通过 write 传递模板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2016-04-25
    • 2012-01-20
    相关资源
    最近更新 更多