Как проверить ViewModels, полученные из абстрактного класса? - PullRequest
0 голосов
/ 28 июля 2011

У меня есть следующий 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, полученные из абстрактного класса?Однако, если есть другой, более реальный способ добиться этого, пожалуйста, сообщите.

1 Ответ

0 голосов
/ 28 июля 2011

У меня была похожая ситуация, когда мне приходилось менять сообщение на основе значения другого свойства.

Я сделал всю проверку на стороне сервера и без аннотаций.

Тогда я просто добавил ModelErrors так:

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

Это немного дополнительная работа и может быть излишним, но это помогло мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...