2015-02-22 2 views
1

Я понимаю, что есть много вопросов по этой проблеме. Но я все же смог решить это, потратив много часов, пытаясь отследить это.MVC 5 - Элемент с тем же ключом уже добавлен

Моя модель выглядит следующим образом:

public class Guide 
    { 
     public int GuideId { get; set; } 
     public int GuideTypeId { get; set; } 

     [Required(ErrorMessage = "Please enter a business name")] 
     [StringLength(80, ErrorMessage="The Business Name cannot exceed 80 characters")] 
     public string BusinessName { get; set; } 

     public System.DateTime? ActiveStartDate { get; set; } 
     public System.DateTime? ActiveEndDate { get; set; } 

     [DataType(DataType.Url, ErrorMessage="The website url entered is not a valid url")] 
     [StringLength(80, ErrorMessage = "The Website Url cannot exceed 80 characters")] 
     public string WebsiteURL { get; set; } 

     [Required(ErrorMessage = "Please enter a your primary location")] 
     [StringLength(80, ErrorMessage = "The Primary Location cannot exceed 80 characters")] 
     public string BaseLocation { get; set; } 

     [DataType(DataType.EmailAddress, ErrorMessage = "The email address entered is not a valid email address")] 
     [Required(ErrorMessage="Please enter a contact email address")] 
     [StringLength(80, ErrorMessage = "The Email Address cannot exceed 80 characters")] 
     public string EmailAddress { get; set; } 

     [DataType(DataType.PhoneNumber, ErrorMessage = "The phone number entered is not a valid phone number")] 
     [StringLength(20, ErrorMessage = "The Phone Number cannot exceed 20 characters")] 
     public string PhoneNumber { get; set; } 

     [Required(ErrorMessage = "Please enter a description of your fees")] 
     public string FeesDescription { get; set; } 

     public string VehiclesAvailable { get; set; } 
     public string AdditionalInformation { get; set; } 
     public string AccountName { get; set; } 
     public string Countries { get; set; } 
     public string NearestCities { get; set; } 
     public string Locations { get; set; } 
     public byte[] ProfileImage { get; set; } 
     public bool Approved { get; set; } 
     public System.DateTimeOffset LastModifiedTime { get; set; } 

     // These four properties are here so we can display all tour types, durations, languages and currencies in a checkbox layout on the page. These are not 
     // what the guide actually supports. These just represent all possible values. 
     public List<TourType>  TourTypeList { get; set; } 
     public List<TourDuration> TourDurationList { get; set; } 
     public List<TourLanguage> TourLanguageList { get; set; } 
     public List<TourCurrency> TourCurrencyList { get; set; } 

     // These four properties represent what the guide does actually support 
     public virtual List<GuideTourType>  GuideTourType { get; set; } 
     public virtual List<GuideTourDuration> GuideTourDuration { get; set; } 
     public virtual List<GuideTourLanguage> GuideTourLanguage { get; set; } 
     public virtual List<GuideTourCurrency> GuideTourCurrency { get; set; } 

     public bool HasImage 
     { 
      get 
      { 
       return ProfileImage.Length > 0; 
      } 
     } 

     public virtual GuideType GuideType { get; set; } 
    } 

Я нашел кого-то, кто пытался отладить это, используя следующий обязательный код:

public class DebugModelBinder : DefaultModelBinder, IModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      Dictionary<string, ModelMetadata> d = new Dictionary<string, ModelMetadata>(StringComparer.OrdinalIgnoreCase); 
      foreach (var p in bindingContext.ModelMetadata.Properties) 
      { 
       var propertyName = p.PropertyName; 
       try 
       { 
        d.Add(propertyName, null); 
       } 
       catch (ArgumentException ex) 
       { 
        throw new ArgumentException(String.Format("The Item {0} as already been added", propertyName), ex); 
       } 
      } 
      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 

Я был в состоянии получить этот код, чтобы работать, но исключение возникает, когда эта строка кода выполнена:

return base.BindModel(controllerContext, bindingContext); 

Так что это происходит ening в базовом классе.

Это исключение создается, когда я делаю сообщение в форме на странице MVC 5. Мой метод контроллера C# никогда не вызван. Ошибка возникает в привязке, и я понятия не имею, какое свойство добавляется дважды. Я также не знаю, как это выяснить.

Если вам нужна дополнительная информация, я буду рад предоставить ее. Я потратил несколько часов на это.

+0

Принимает ли действие модель «Руководство» в качестве параметра? Вы можете попробовать прокомментировать свойства один за другим и выяснить, какой из них вызывает проблему. – Zabavsky

+0

@zabavsky - это именно то, что я начал делать. Я удалил большинство из них, и мой метод контроллера теперь вызван. Теперь мне просто нужно найти оскорбительное свойство. –

+0

Какова подпись вашего метода Action Controller? –

ответ

3

В моем случае, это произошло из-за дубликат атрибута в сущности

public class Employee 
{ 
public int roleID {get; set;} 
... 
... 
public int RoleID {get; set;} 
} 

, когда я удалил Int Роль, исчезла эта ошибка.

Смежные вопросы