0

感谢您的任何想法。

当我通过一些自定义验证属性工作时,我遇到了一个应该很简单的问题,但让我很难过。

授权用户将拥有一个 UserProfile,其中包含他们工作所在站点的密钥。该站点是数据库中的一个记录集。此站点记录集中的第 1 个字段是一个正则表达式,它表示完全独立的表中字段的有效格式。输入到另一个表中的数据对所有注册用户都是通用的,但一个特定的字段与他们机构使用的 ID 格式有关。

有没有一种干净的方法可以动态地将正则表达式验证器添加到属性中?

一如既往地感谢你。

4

1 回答 1

0

这是我想出的,但很想知道是否有更好的解决方案:

命名约定是为了允许自动映射器展平模型(每个 StudyCentre 与 RecordSystem 具有多对一的关系(一些系统共享患者索引系统)

Mapper.CreateMap<StudyCentre, ParticipantRegistration.StudyCentreViewData>();

作为 ViewModel 中单个 TrialParticipant 的嵌套类

public StudyCentreViewData ViewData { get; set; }
public class StudyCentreViewData
{
    public string Abbreviation { get; set; }
    public string RecordSystemName { get; set; }
    public string RecordSystemHospitalNoRegEx { get; set; }
    public string RecordSystemNotationDescription { get; set; }
    public IDictionary<string, object> HospitalNoRegEx()
    {
         return DynamicClientValidation.RegEx(errorMessage:String.Format("{0} must consist of {1}",
                                                                       RecordSystemName,
                                                                       RecordSystemNotationDescription),
                                              regExPattern: RecordSystemHospitalNoRegEx);
    }
}

其他属性(例如 StudyCentre.Abbreviation 用于标签)函数 RegEx 很简单:

public static class DynamicClientValidation
{
    public static IDictionary<string, object> RegEx(string errorMessage, string regExPattern)
    {
        var returnVal = new Dictionary<string, object>(3);
        returnVal.Add("data-val-regex", errorMessage);
        returnVal.Add("data-val-regex-pattern", regExPattern);
        returnVal.Add("data-val", "true");
        return returnVal;
    }
}

控制器像这样设置视图模型:

model.ViewData = Mapper.Map<StudyCentre, ParticipantRegistration.StudyCentreViewData>(_studyCentre.GetCentreByUser(_currentUserName));

并在视图中(LabelDetailsfor 是一个自定义助手):

<div class="editor-label">
    @Html.LabelDetailsFor(model => model.HospitalID,Model.ViewData.Abbreviation + " ID", Model.ViewData.RecordSystemName) 
</div>
<div class="editor-field">
    @Html.TextBoxFor(model => model.HospitalID, Model.ViewData.HospitalNoRegEx())
    @Html.ValidationMessageFor(model => model.HospitalID)
 </div>
于 2012-08-13T06:44:17.947 回答