У меня есть следующий 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
будет заменено на определенную пользователем дату.Я хочу соответствующее сообщение об ошибке в каждом случае.По сути, единственная разница должна заключаться в аннотациях. (я думаю, что это ключ, но я не уверен, как решить эту проблему, поэтому мой замысловатый подход!)
Я попытался создатьабстрактная модель базового представления, а затем вывод стандартного файла и шаблонных классов 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, полученные из абстрактного класса?Однако, если есть другой, более реальный способ добиться этого, пожалуйста, сообщите.