如何验证从抽象类派生的ViewModels?

时间:2011-07-28 13:01:24

标签: asp.net-mvc-3 validation viewmodel

我有以下EditorTemplate

@model ESG.Web.Models.FileInfo // <-- Changed to BaseFileInfo
@{
    ViewBag.Title = "FileInfoEditorTemplate";
}
<fieldset>
    <table class="fileInfoEdit">
        <tr>
            <td>Base Directory:</td>
            <td>@Html.EditorFor(model => model.Directory)</td>
            <td>@Html.ValidationMessageFor(model => model.Directory)</td>
        </tr>
        <tr>
            <td>Filename:</td>
            <td>@Html.EditorFor(model => model.Filename)</td>
            <td>@Html.ValidationMessageFor(model => model.Filename)</td>
        </tr>
    </table>
</fieldset>

对应于此ViewModel

public class FileInfo
{
    [Display(Name = "Directory")]
    [Required(ErrorMessage="Please specify the base directory where the file is located")]
    public string Directory { get; set; }
    [Display(Name = "File Name")]
    [Required(ErrorMessage = "Please specify the name of the file (Either a templated filename or the actual filename).")]
    public string Filename { get; set; }

}

我想要做的是重用上面的EditorTemplate,但是根据使用ErrorMessage类的上下文自定义FileInfo。我可以有一个标准文件名,例如abc.txt或“模板化”文件名,例如abc_DATE.txt,其中DATE将替换为某个用户指定的日期。我希望在每种情况下都有适当的错误消息。本质上,唯一的区别应该是Annotations。(我认为这是关键,但我不确定如何解决这个问题,因此我的方法很复杂!)

我尝试创建一个抽象的基本视图模型,然后派生一个标准文件和模板化的FileInfo类。我将当前EditorTemplate的声明更改为

 `@model ESG.Web.Models.BaseFileInfo`  

并像

一样使用它
@Html.EditorFor(model => model.VolalityFile, "FileInfoEditorTemplate")` 

其中model.VolalityFileTemplatedFileInfo。这些值在“编辑”页面上正确显示,但是,如果未正确填充字段,则不会进行客户端验证。我最初的猜测是,这与抽象类定义有关(在字段上没有任何注释)。

public abstract class BaseFileInfo
{
    public abstract string Directory { get; set; }
    public abstract string Filename { get; set; }
}

// eg of derived class
public class TemplatedFileInfo : BaseFileInfo
{
    [Display(Name = "File Name")]
    [Required(ErrorMessage = "Please specify the name of a templated file eg someFileName_DATE.csv")]
    public override string Filename { get; set; }

    [Display(Name = "Directory")]
    [Required(ErrorMessage="Please specify the base templated directory where the file is located")]
    public override string Directory { get; set; }
}

这是我能想到解决我的要求的唯一方法,因此问题 - 如何验证从抽象类派生的ViewModels?但是,如果有另一种更可行的方法来实现这一目标,请提供建议。

1 个答案:

答案 0 :(得分:0)

我有类似的情况,我必须根据另一个属性的值更改消息。

我制作了整个验证服务器端而没有注释。

然后我就这样添加了ModelErrors:

ModelState.AddModelError("YourPropertyName", "The Error Message you want to show.);

这可能是一项额外的工作并且可能有些过分,但它确实对我有用。