在asp.net mvc4中动态添加DisplayName属性

时间:2014-04-02 08:39:38

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我有一个asp.net mvc4 razor表单,其中包含一系列复选框。 复选框从动态生成的列表中填充。列表如下所示:

public class UserViewModel
{
    [Required]
    [MaxLength(32)]
    [DataType(DataType.Text)]
    [DisplayName("ID")]
    public string UserId { get; set; }

    public List<SkillSetSelector> SkillSets { get; set; }
}

public class SkillSetSelector
{
    public string Code { get; set; }

    public string Description { get; set; }

    public bool Selected { get; set; }
}

然后我填写表格中的复选框:

    @for (int i = 0; i < Model.SkillSets.Count;i++ )
{
    <div>
 <table class = "searchtable">
 <tr>
 <td>
 @Html.CheckBoxFor(m => m.SkillSets[i]) @Model.SkillSets[i].Description</td>
</tr>
</table>
</div>
    }

我的问题是我想动态分配每个复选框的DisplayName属性。即我希望它与Skillsets [i] .Description具有相同的价值。目前,当模型被发送回控制器时,没有知道每个复选框属于哪个项目,因为描述返回null - 所选值是正确的但除了字段的顺序之外什么都没有告诉你哪个项目是哪个。有没有办法做到这一点?复选框必须是动态的,因为它们所基于的数据是用户可定义的。 感谢。

2 个答案:

答案 0 :(得分:2)

DisplayName数据注释属性需要常量值。你无法动态设置它。

但您可以参考资源文件中的值或为此创建自己的Custom Model Meta Data Provider 请查看此文章 Custom Model MetaData Provider implementation

答案 1 :(得分:0)

感谢你帮助Murali。

最后,我解决了通过添加带有项目ID的隐藏文本框而不知道哪个项目被发送回来的问题:

@for (int i = 0; i < Model.SkillSets.Count;i++ )
{
    <div>
 <table class = "searchtable">
<tr>
<td>
<div>
@Html.CheckBoxFor(m => m.SkillSets[i].Selected) @Model.SkillSets[i].Description
</div>
</td>
<td>
<div>
@Html.TextBoxFor(m => m.SkillSets[i].ID, new {id = "custselecthidden" })
</div>
</td>
</tr>
</table>
</div>
}

这样,ID就会在模型中发回,我现在知道是什么了。