如何在MVC Web Api RC中基于自定义逻辑隐藏Model类字段

时间:2012-07-10 11:31:29

标签: asp.net-mvc-4 asp.net-web-api

我使用的是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 个答案:

答案 0 :(得分: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

希望这会有所帮助。

干杯。

答案 1 :(得分:1)

最好的办法是返回dynamic个对象。在这种情况下,您可以说:

        dynamic viewModel = new ExpandoObject();
        viewModel.Id = 12;
        if(role == "Admin")
        {
            viewModel.SecureStuff = "Others should not see it";
        }

答案 2 :(得分:0)

它不会那么简单,因为你需要在视图中有条件地渲染字段。但是你可以通过该属性获得大部分内容。

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

干杯。

答案 3 :(得分:0)

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

从db获取Employees列表并将它们列在列表中后,我再次迭代并向我不想显示的字段添加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的宝贵建议