Устанавливание значений ModelState в пользовательском образцовом редакторе связей

Я использую пользовательский образцовый редактор связей в ASP.NET MVC 2, который похож на это:

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
        if(string.IsNullOrWhiteSpace(obj.Slug))
        {
            // creating new object
            obj.Created = obj.Modified = DateTime.Now;
            obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name;
            // slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed
            obj.Slug = obj.Title;
            ModelStateDictionary modelStateDictionary = bindingContext.ModelState;
            modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));
...

Когда я возвращаюсь из этого редактора связей в действие контроллера, мой бизнес-объект, который предоставляется в качестве параметра действию, правильно изменен (строки obj. Созданный =.... работают).

Однако ModelState не обновляется. Я знаю это, потому что я Потребовал на свойстве Slug своего бизнес-объекта и хотя я изменил ModelStateDictionary в своем пользовательском образцовом редакторе связей, предоставив Краткий заголовок ему (как Вы видите выше), ModelState. IsValid является все еще ложным.

Если я поместил ModelState ["Краткий заголовок"] в мое окно Watch на Сеансе отладки, это говорит, что имеет Ошибки (1), так по-видимому, это - пустые и сбои как таковые.

Как я могу правильно изменить ModelState в пользовательском образцовом коде редактора связей?

15
задан mare 6 April 2010 в 21:47
поделиться

1 ответ

По-видимому, нет способа повторно проверить ModelState после изменения значения некоторого ключа . IsValid остается ложным, поскольку установка нового значения для некоторого ключа не вызывает повторной проверки.

Решение состоит в том, чтобы сначала удалить ключ, который запускал IsValid как false, воссоздать его и присвоить ему значение. Когда вы это сделаете, ModelState автоматически перепроверит, и если все в порядке, IsValid вернет true.

Примерно так:

bindingContext.ModelState.Remove("Slug");
bindingContext.ModelState.Add("Slug", new ModelState());
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));
20
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: