我有以下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.VolalityFile
是TemplatedFileInfo
。这些值在“编辑”页面上正确显示,但是,如果未正确填充字段,则不会进行客户端验证。我最初的猜测是,这与抽象类定义有关(在字段上没有任何注释)。
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?但是,如果有另一种更可行的方法来实现这一目标,请提供建议。
答案 0 :(得分:0)
我有类似的情况,我必须根据另一个属性的值更改消息。
我制作了整个验证服务器端而没有注释。
然后我就这样添加了ModelErrors:
ModelState.AddModelError("YourPropertyName", "The Error Message you want to show.);
这可能是一项额外的工作并且可能有些过分,但它确实对我有用。