![](/img/trans.png)
[英]How to create a model with self reference in Entity Framework Code-First?
[英]How to create a custom attribute for Code-first model class?
环境:ASP.NET MVC5 +实体框架代码优先
我有一个关于为Code-fist类定义自定义属性的问题。
public class Vender
{
public int VenderID { get; set; }
public string VenderCode { get; set; }
public string CompanyCode { get; set; }
public string CompanyFullName { get; set; }
public string CreateUser { get; set; }
[Display(Name = "City")]
public int VenderCityId { get; set; }
}
然后我有一个城市班。 该数据表将存储许多城市
public class City
{
public int Id { get; set; }
public string Name { get; set; }
}
DataAuditLog的另一个表
public class DataAudit
{
public enum DbActionType
{
[Display(Name = "Add")] I,
[Display(Name = "Update")] U,
[Display(Name = "Delete")] D
}
public int ID { get; set; }
public string TableName { get; set; }
public string TableDataId { get; set; }
public string UserId { get; set; }
public DbActionType DbAction { get; set; }
public string PropertyName { get; set; }
public string OldData { get; set; }
public string NewData { get; set; }
public DateTime UpdateDateTime { get; set; }
}
我使用此表记录Vender表中的所有更改。 因此,有表名称,ID和属性来定位供应商的特定行
所以这是我的打算。
1.为创建自定义属性
[Display(Name = "City")]
[CustomAttribute(City)]
public int VenderCityId { get; set; }
2.在viewmodel中,获取此自定义属性并查询要显示的城市名称。
我的问题是1.这是一个好的设计吗? 如果不是,请告诉我2。如果是,我找不到如何为该属性自定义属性。
编辑:添加视图。 在当前的设计中,城市的数据日志喜欢从DB中提取的OldData =“ 1”,NewData =“ 2”。 我只是将值显示为OldData =“ Shanghai”,NewData =“ Beijing”
<div>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().UserId)
</th>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().PropertyName)
</th>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().DbAction)
</th>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().OldData)
</th>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().NewData)
</th>
<th>
@Html.DisplayNameFor(model => model.DataAuditsList.FirstOrDefault().UpdateDateTime)
</th>
<th></th>
</tr>
@foreach (var item in Model.DataAuditsList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserId)
</td>
<td>
@Html.DisplayFor(modelItem => item.PropertyName)
</td>
<td>
@Html.DisplayFor(modelItem => item.DbAction)
</td>
<td>
@Html.DisplayFor(modelItem => item.OldData)
</td>
<td>
@Html.DisplayFor(modelItem => item.NewData)
</td>
<td>
@Html.DisplayFor(modelItem => item.UpdateDateTime)
</td>
</tr>
}
</table>
您必须像这样从“ ValidationAttiribute”继承一个类:
public class CustomAttribute : ValidationAttribute
{
}
然后在您的类中做您想做的...您可以覆盖isValid方法进行验证逻辑
Edit:
<td>
//You can send a query to db right here, receive city name for "item.OldData" and show it in label
@Html.DisplayFor(modelItem => item.OldData)
</td>
<td>
@Html.DisplayFor(modelItem => item.NewData)
</td>
或者像我之前说过的那样,您可以在此视图的控制器中执行此操作。但是我认为您只想显示一条记录,如果要显示更多记录,可以使用字典,'key'是OldData,值是城市名称,那么您可以将此字典放入ViewBag中,但是您已经有了DataAuditsList,可以再添加两个属性吗? OldName和NewName并在控制器中设置这些属性值,然后在您的视图中只需更改此行
<td>
@Html.DisplayFor(modelItem => item.OldName)
</td>
<td>
@Html.DisplayFor(modelItem => item.NewName)
</td>
最后编辑:
您可以定义一个静态类和一些辅助方法:
private static YourDBContext ctx = new YourDbContext();
public static class HelperMethods {
public static string GetCityName(string cityId){ //your olddata is string
string name = (from c in ctx.City
where c.Id == cityId
select c.Name);
return name;
}
}
然后,您可以从视图中调用此方法:
<td>
@HelperMethods.GetCityName(item.OldData)
</td>
<td>
@HelperMethods.GetCityName(item.NewData)
</td>
实际上,您可以定义扩展方法,只需将“ this”关键字放在cityId参数之前:
public static string GetCityName(this string cityId)
然后这样称呼它:
@item.OldData.GetCityName()
如果要扩展此功能,可以定义许多其他方法,这将是我认为更好的常用方法。祝您好运...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.