我使用的是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; }
但上面是编译时声明,我不能强加任何条件。
问题:如何在运行时基于某些条件进行序列化时忽略字段/属性?
答案 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的宝贵建议