2016-07-05 1 views
1

In ASP.NET Core-RC 1 (volle .NET Framework) funktioniert:Modelstate nicht den folgenden Code enthalten, die für mich eine Definition für CopyTo

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); 
       } 
      } 
     } 
    } 
} 

Aber in ASP.NET-Core 1.0 (Voll .NET Framework), tritt ein Fehler auf:

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); 
       } 
      } 
     } 
    } 
} 

'Modelstate' enthält keine Definition für 'CopyTo' und ohne extension method 'CopyTo' ein erstes Argument vom Typ akzeptieren 'Modelstate' b könnte e gefunden (möglicherweise fehlt eine using -Direktive oder ein Assemblyverweis?)

Vielleicht muss ich zu einer Versammlung ein neues Referenz verbinden, die in ASP.NET Core-RC 1 benötigt wird, nicht wahr?

+0

Vielleicht könnte das Hinzufügen von 'System.Web' den Fehler beheben. –

+0

@diiN_ Nein, das Hinzufügen von 'System.Web' löste das Problem nicht –

+1

Bitte verwenden Sie nicht das ASP.net-MVC6-Tag für ASP.NET Core MVC verwandte Fragen, um Verwirrung über eine zukünftige ASP.NET zu vermeiden MVC-Version. Stecke Tags auch nicht in Fragetitel ein. – Tseng

Antwort

1

ModelStateDictionary implementiert nicht IDictionary<,> daher keine CopyTo Methode darauf. In Ihrem Fall könnten Sie Ihren Code mit

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

ersetzen und das sollte funktionell gleichwertig sein, was Sie in dem ursprünglichen Schnipsel zu tun.

Verwandte Themen