3

我正在使用 Asp.Net Mvc Web api RC。

我想使用自定义属性隐藏模型类的字段/属性。下面是我的课:

public class Employee
{              
     public int EmpId { get; set; }       
     public string Name{ get; set; }

     //Wanted to hide this attribute based on custom logic. Like for a certain role, i want to hide the designation
     public string Designation{ get; set; }

     public string Department{ get; set; }
}

我们如何使用数据注释来实现。我的意思是我想创建一个单独的属性以这种方式使用:

[HideForRoles(Roles="Admin,Writer")]
public string Designation{ get; set; }

更新 :

因为我正在开发 web api。响应被序列化为 XML 或 Json 格式,具体取决于格式化程序。所以更好的问题是如何在写入响应时不允许字段被序列化。

但是,一种选择可能是使用 IgnoreDataMember 属性。喜欢

[IgnoreDataMember]
public string Designation{ get; set; }

但以上是一个编译时声明,我不能强加任何条件。

问题:如何在运行时根据某些条件进行序列化时忽略字段/属性?

4

4 回答 4

2

完全错过了您使用 Web Api 的第一轮,我很抱歉。

您要做的是创建自定义格式化程序。

这里有一篇关于 MVC 和 Web Api 之间的流程/差异的好文章(我知道你已经理解了,这里仍然有一些有效的观点): http: //lostechies.com/jimmybogard/2012/04/10/asp -net-web-api-mvc-viewmodels-and-formatters/

这是自定义格式化程序的示例实现: http ://www.tugberkugurlu.com/archive/creating-custom-csvmediatypeformatter-in-asp-net-web-api-for-comma-separated-values-csv-format

在此基础上,您将使用反射来读取属性,在您必须编写的自定义 ActionFilterAttribute 基础上构建,您可以在其中评估用户的角色并确定应该省略/包含哪些字段。这是一个动作过滤器的示例: https ://github.com/MisterJames/MovieFu/blob/master/MovieFu/ActionFilters/UserNameFilter.cs

希望这有助于更多。

干杯。

于 2012-07-12T14:55:24.943 回答
1

你最好的选择是返回一个dynamic对象。在这种情况下,您可以说:

        dynamic viewModel = new ExpandoObject();
        viewModel.Id = 12;
        if(role == "Admin")
        {
            viewModel.SecureStuff = "Others should not see it";
        }
于 2012-07-12T09:39:30.733 回答
0

我已经在模型存储库中完成了授权检查。相当理想的方法是创建自定义格式化程序以根据某些条件隐藏某些字段。

从 db 获取员工列表并将它们放入列表后,我再次迭代并将 NULL 放置到我不想显示的字段中。我写的代码如下:

foreach (var employee in listEmployees)
{
     //get all props. of Employees object using reflection
     var props = employee .GetType().GetProperties();

     //loop through each field to match with the field name to remove/place null
     foreach (var propertyInfo in props)
     {
          var fieldName = propertyInfo.Name;
          if (fieldsNamesToRemove .Contains(fieldName))
          {
                    propertyInfo.SetValue(employee , null, null);
          }
     }
 }

这里的 fieldsNamesToRemove 是我根据当前用户的角色动态创建的列表。

这个解决方案实际上为我们不想显示的字段放置了一个 NULL。因此,在 JSON 格式中,字段不显示,但在 XML 中,字段以类似 lt; 的语法显示。指定 i:nil="true"/ gt;,但可以管理,因为我们主要需要处理 json 响应。

感谢 Ali 和 MisterJames 提出的宝贵建议

于 2012-07-13T07:39:06.077 回答
0

它不会那么简单,因为您需要有条件地在视图中呈现字段。但是你可以通过属性获得大部分的方式。

您需要让您的自定义属性元数据知道,然后检查您的视图中的属性。此处发布了一个解决方案:Can't get Custom Attribute Value in MVC3 HTML Helper

干杯。

于 2012-07-10T16:52:20.633 回答