如何为Code-first模型类创建自定义属性?

时间:2013-11-23 11:10:49

标签: c# asp.net-mvc entity-framework

环境: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>

1 个答案:

答案 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()

如果你想扩展这个功能,你可以定义许多其他方法,这将是我认为更好的常用方法。祝你好运......