Каждая сводка проверки связана с собственным частичным представлением

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

Я немного посмотрел в Интернете и увидел, что есть способ сделать это следующим образом:

    var SecurityQuestionsErrors = ViewData.ModelState.Where(ms => ms.Key == "SecurityQuestions");
if (SecurityQuestionsErrors.Count()>0)
{
    @Html.ValidationSummary("", new { @class = "" })
}

Поэтому я хотел бы иметь этот код в каждом частичном представлении, чтобы увидеть, связана ли ошибка именно с этим.

Когда ошибка исходит от контроллера (я могу добавить ключ самостоятельно, он отлично работает):

            catch (FaultException<IncorrectQuestionFault>)
        {
            // question is incorect
            ModelState.AddModelError("SecurityQuestions", Resources.errors.incorrectQuestion);
        }

Но когда ошибка исходит от ViewModel, он не добавляет ключ, и я облажался...

        [Required(ErrorMessageResourceName = "IsRequired", ErrorMessageResourceType = typeof(Resources.errors))]
    [StringLength(40, MinimumLength = 7, ErrorMessageResourceName = "NotLongEnough", ErrorMessageResourceType = typeof(Resources.errors))]
    [Display(Order = 0, Name = "question", ResourceType = typeof(Resources.errors))]
    public string question{ get; set; }

Итак, мой вопрос: правильно ли я делаю это? Есть ли способ добавить ключ к ошибкам, исходящим от ViewModel? Должен ли я сделать это по-другому?

Вся помощь приветствуется: D




Ответы (1)


Предполагая, что это ваше свойство модели View:

[Required(ErrorMessageResourceName = "IsRequired", ErrorMessageResourceType = typeof(Resources.errors))]
[StringLength(40, MinimumLength = 7, ErrorMessageResourceName = "NotLongEnough", ErrorMessageResourceType = typeof(Resources.errors))]
[Display(Order = 0, Name = "question", ResourceType = typeof(Resources.errors))]
public string question{ get; set; }

@Html.ValidationSummary(false, "", new { @class = "text-danger" })


@Html.LabelFor(x => x.question)
@Html.EditorFor(x => x.question)

Это по умолчанию будет принимать все ошибки проверки и помещать их в свой собственный div.

Если вы пытаетесь поймать ошибку на контроллере, вы можете:

 if (!ModelState.IsValid)
{
    // the model is invalid

    //if you are trying to catch different errors here
    var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
    //Now you have all the errors and can give specific messages for a given error
    ModelState.AddModelError(string.Empty, "Your error goes here");
}
person Robert    schedule 07.11.2016
comment
Я делаю это, потому что хочу, чтобы все ошибки были в одном месте для каждого представления, а не рядом с каждым текстовым полем. Ошибки на французском языке, но я думаю, вы поняли, что prntscr.com/d4dltg я возвращаюсь к контроллер, потому что веб-служба, стоящая за приложением, выдает ошибки, и именно здесь мне нужно их поймать ^^. Модель представления проверяет формат вводимых данных, а веб-служба проверяет сами данные. - person Helpha; 08.11.2016
comment
@Helpha Я думаю, что мой обновленный ответ решит то, чего вы пытаетесь достичь. - person Robert; 08.11.2016