环境: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和属性来定位Vender的具体行
所以我打算这样做。
1.为
创建自定义属性[Display(Name = "City")]
[CustomAttribute(City)]
public int VenderCityId { get; set; }
2.在viewmodel中,获取此自定义属性并查询要显示的城市名称。
我的问题是 这是一个好的设计吗?如果没有,请告诉我 2.如果是,我找不到如何为属性自定义属性。
编辑: 添加视图。目前的设计,城市的数据日志喜欢OldData =“1”,NewData =“2”,从DB中提取。 我只是向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>
答案 0 :(得分:0)
您必须从“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>
或者正如我之前所说,你可以在这个视图的控制器中执行此操作。但我认为你只想显示一条记录,如果你想要更多你可以使用Dictionary,'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>
事实上,你可以定义扩展方法,只需在cityId参数之前加上'this'关键字:
public static string GetCityName(this string cityId)
然后像这样称呼它:
@item.OldData.GetCityName()
如果你想扩展这个功能,你可以定义许多其他方法,这将是我认为更好的常用方法。祝你好运......