繁体   English   中英

如何为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM