ModelStateDictionary не содержит определения для CopyTo.

В ASP.NET Core RC 1 (полная .NET Framework) у меня работает следующий код:

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Filters;
using Microsoft.AspNet.Mvc.ModelBinding;
using Newtonsoft.Json;

namespace MyProject.Classes.Filters.ModelState
{
    public class SetTempDataModelStateAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);

            var controller = filterContext.Controller as Controller;
            if (controller != null)
            {
                var modelState = controller.ViewData.ModelState;
                if (modelState != null)
                {
                    var dictionary = new KeyValuePair<string, ModelStateEntry>[modelState.Count];
                    modelState.CopyTo(dictionary, 0);
                    var listError = dictionary.ToDictionary(m => m.Key, m => m.Value.Errors.Select(s => s.ErrorMessage).FirstOrDefault(s => s != null));
                    controller.TempData["ModelState"] = JsonConvert.SerializeObject(listError);
                }
            }
        }
    }
}

Но в ASP.NET Core 1.0 (полная .NET Framework) возникает ошибка:

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Newtonsoft.Json;

namespace MyProject.Models.ModelState
{
    public class SetTempDataModelStateAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);

            var controller = filterContext.Controller as Controller;
            if (controller != null)
            {
                var modelState = controller.ViewData.ModelState;
                if (modelState != null)
                {
                    var dictionary = new KeyValuePair<string, ModelStateEntry>[modelState.Count];
                    modelState.CopyTo(dictionary, 0);
                    modelState = dictionary.[0];
                    var listError = dictionary.ToDictionary(m => m.Key, m => m.Value.Errors.Select(s => s.ErrorMessage).FirstOrDefault(s => s != null));
                    controller.TempData["ModelState"] = JsonConvert.SerializeObject(listError);
                }
            }
        }
    }
}

«ModelStateDictionary» не содержит определения для «CopyTo», и не удалось найти метод расширения «CopyTo», принимающий первый аргумент типа «ModelStateDictionary» (вам не хватает директивы using или ссылки на сборку?)

Может быть, мне нужно подключить новую ссылку на сборку, которая не нужна в ASP.NET Core RC 1?


person Kolya_Net    schedule 05.07.2016    source источник
comment
Возможно, добавление System.Web может устранить ошибку.   -  person diiN__________    schedule 05.07.2016
comment
@diiN_ Нет, добавление System.Web не решило проблему   -  person Kolya_Net    schedule 05.07.2016
comment
Не используйте тег asp.net-mvc6 для вопросов, связанных с ASP.NET Core MVC, чтобы избежать путаницы в отношении будущей версии ASP.NET MVC. Также не вставляйте теги в названия вопросов.   -  person Tseng    schedule 05.07.2016
comment
ModelStateDictionary не реализует IDictionary<,>, поэтому на нем нет метода CopyTo. В вашем случае вы можете заменить свой код на var listErrorr = modelState.ToDictionary(m => m.Key, m => m.Value.Errors.Select(s => s.ErrorMessage).FirstOrDefault(s => s != null));, и это должно быть функционально эквивалентно тому, что вы делали во фрагменте.   -  person Pranav    schedule 06.07.2016
comment
@Pranav Спасибо, это работает. Пожалуйста, опубликуйте этот комментарий как ответ.   -  person Kolya_Net    schedule 08.07.2016


Ответы (1)


ModelStateDictionary не реализует IDictionary<,>, поэтому на нем нет метода CopyTo. В вашем случае вы можете заменить свой код на

var listErrorr = modelState.ToDictionary(
  m => m.Key, 
  m => m.Value.Errors
    .Select(s => s.ErrorMessage)
    .FirstOrDefault(s => s != null)
); 

и это должно быть функционально эквивалентно тому, что вы делали в исходном фрагменте.

person Pranav    schedule 08.07.2016