2011-09-01 77 views
2

我有一个用户想要选择他的性别而不是必填字段的senario。在我的用户界面中,性别列在下拉列表中,其中有两个选项男性女性并且具有可选标签性别。但是性别是我项目中的一个枚举,所以如果用户没有选择任何性别,则必须将空值输入到数据库中,但不幸的是,由于一些强制性异常,我无法做到这一点。任何机构都可以帮助我解决这个问题?试图从int映射时,转换异常无效?枚举?

我是用petapoco作为我的ORM,所以我的用户实体看起来像这样

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using Helpers; 
using PetaPoco; 
using StructureMap; 

[TableName("User")] 
[PrimaryKey("UserId")] 
[ExplicitColumns] 
public class User 
{ 
    [Column("UserId")] 
    public int Id { get; set; } 

    [Column] 
    [Required] 
    public Guid Identifier { get; set; } 

    [Column("UserStatusId")] 
    [Required] 
    public UserStatus UserStatus { get; set; } 

    [Column] 
    [Required] 
    public int RoleId { get; set; } 

    [Column] 
    public int? SchoolId { get; set; } 

    [Column] 
    public int? LanguageId { get; set; } 

    [Column("TitleId")] 
    [Required] 
    public Title Title { get; set; } 

    [Column("GenderId")] 
    [Required] 
    public Gender? Gender { get; set; } 

    [Column] 
    [Required] 
    [StringLength(35)] 
    public string Username { get; set; } 

    [StringLength(100)] 
    public string Password { get; set; } 

    [Column] 
    [StringLength(100)] 
    public string PasswordEncrypted { get; set; } 

    [Column] 
    [StringLength(10)] 
    public string PasswordSalt { get; set; } 

    [Column] 
    [Required] 
    [DataType(DataType.EmailAddress)] 
    [StringLength(255)] 
    public string Email { get; set; } 

    [Column] 
    [Required] 
    [StringLength(35)] 
    public string FirstName { get; set; } 

    [Column] 
    [Required] 
    [StringLength(35)] 
    public string LastName { get; set; } 

    public string FullName { 
     get 
     { 
      return string.Concat(FirstName, " ", LastName); 
     } 
    } 

    [Column] 
    public DateTime? DateOfBirth { get; set; } 

    [Column] 
    public bool Subscribed { get; set; } 

    [Column] 
    public bool TermsAgreed { get; set; } 

    [Column] 
    public DateTime? TermsAgreedDate { get; set; } 

    [Column] 
    public DateTime CreatedDate { get; set; } 

    [Column] 
    public DateTime ModifiedDate { get; set; } 

    [Column] 
    public DateTime? LoginDate { get; set; } 

    public Role Role { get; set; } 

    public School School { get; set; } 

    public Language Language { get; set; } 
} 

我的性别枚举是这样

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 

public enum Gender 
{ 
    /// <summary> 
    /// Male 
    /// </summary> 
    [Description("Male")] 
    Male = 1, 

    /// <summary> 
    /// Female 
    /// </summary> 
    [Description("Female")] 
    Female 
} 

和我的视图模型看起来像这样

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

/// <summary> 
/// Model for edit view model user 
/// </summary> 
public class UserEditViewModel 
{ 
    /// <summary> 
    /// Gets or sets the User id 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Gets or sets Title Id 
    /// </summary> 
    public int UserTitle { get; set; } 

    /// <summary> 
    /// Gets or sets the school Name 
    /// </summary> 
    public string Username { get; set; } 

    /// <summary> 
    /// Gets or sets the School first name 
    /// </summary> 
    public string FirstName { get; set; } 

    /// <summary> 
    /// Gets or sets the school last name 
    /// </summary> 
    public string LastName { get; set; } 

    /// <summary> 
    /// Gets or sets the school address line1 
    /// </summary> 
    public string Password { get; set; } 

    /// <summary> 
    /// Gets or sets the school address line2 
    /// </summary>   
    public string ConfirmPassword { get; set; } 

    /// <summary> 
    /// Gets or sets the email address of the school 
    /// </summary> 
    public string Email { get; set; } 

    /// <summary> 
    /// Gets or sets the created date 
    /// </summary> 
    public DateTime CreatedDate { get; set; } 

    /// <summary> 
    /// Gets or sets user status id 
    /// </summary> 
    public int UserStatus { get; set; } 

    /// <summary> 
    /// Gets or sets SchoolName 
    /// </summary> 
    public string SchoolDetails { get; set; } 

    /// <summary> 
    /// Gets or sets Language Id 
    /// </summary> 
    public int LanguageId { get; set; } 

    /// <summary> 
    /// Gets or sets Langauge list 
    /// </summary> 
    public IList<Language> Langauges { get; set; } 

    /// <summary> 
    /// Gets or sets RoleId 
    /// </summary>   
    public int RoleId { get; set; } 

    /// <summary> 
    /// Gets or sets SchoolId 
    /// </summary> 
    public int SchoolId { get; set; } 

    /// <summary> 
    /// Gets or sets DateOfBirth 
    /// </summary> 
    public DateTime DateOfBirth { get; set; } 

    /// <summary> 
    /// Gets or sets Gender 
    /// </summary> 
    public int? Gender { get; set; } 

    /// <summary> 
    /// Gets UserGender list 
    /// </summary> 
    public Dictionary<int, string> Genders 
    { 
     get 
     { 
      var listitems = new Dictionary<int, string>(); 
      foreach (Gender r in Enum.GetValues(typeof(Gender))) 
      { 
       listitems.Add((int)r, r.ToString()); 
      } 

      return listitems; 
     } 
    } 

    /// <summary> 
    /// Gets Title list 
    /// </summary> 
    public Dictionary<int, string> Titles 
    { 
     get 
     { 
      var listitems = new Dictionary<int, string>(); 
      foreach (Title r in Enum.GetValues(typeof(Title))) 
      { 
       listitems.Add((int)r, r.ToString()); 
      } 

      return listitems; 
     } 
    } 

    /// <summary> 
    /// Gets UserStatus list 
    /// </summary> 
    public Dictionary<int, string> UserStatuses 
    { 
     get 
     { 
      var listitems = new Dictionary<int, string>(); 
      foreach (UserStatus r in Enum.GetValues(typeof(UserStatus))) 
      { 
       listitems.Add((int)r, r.ToString()); 
      } 

      return listitems; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether Subscribed 
    /// </summary> 
    public bool Subscribed { get; set; } 

    /// <summary> 
    /// Gets or sets a value indicating whether TermsAgreed 
    /// </summary> 
    public bool TermsAgreed { get; set; } 
} 

而我使用automapper来映射User到UserEditviewModel,反之亦然

Mapper.CreateMap<User, UserEditViewModel>().ForMember(
      dest => dest.Langauges, opt => opt.Ignore()).ForMember(
      dest => dest.Password, opt => opt.Ignore()).ForMember(
      dest => dest.ConfirmPassword, opt => opt.Ignore()).ForMember(
      dest => dest.SchoolDetails, opt => opt.MapFrom(src => 
       (!string.IsNullOrEmpty(src.School.SchoolDetails.Region)) ? 
       string.Concat(src.School.Name, ", ", 
       src.School.SchoolDetails.City, ", ", 
       src.School.SchoolDetails.Region, ", ", 
       src.School.SchoolDetails.PostalCode) : 
       string.Concat(src.School.Name, ", ", 
       src.School.SchoolDetails.City, ", ", 
       src.School.SchoolDetails.PostalCode))).ForMember(
      dest => dest.Titles, opt => opt.Ignore()).ForMember(
      dest => dest.UserStatuses, opt => opt.Ignore()).ForMember(
      dest => dest.UserTitle, opt => opt.MapFrom(src => src.Title)).ForMember(
      dest => dest.Genders, opt => opt.Ignore()).ForMember(
      dest => dest.Gender, opt => opt.MapFrom(src => 
       src.Gender == null ? (int?)null : (int)src.Gender));    

Mapper.CreateMap<UserEditViewModel, User>().ForMember(
      dest => dest.Username, opt => opt.MapFrom(src => 
       HttpUtility.HtmlDecode(src.Username))).ForMember(
      dest => dest.FirstName, opt => opt.MapFrom(src => 
       HttpUtility.HtmlDecode(src.FirstName))).ForMember(
      dest => dest.LastName, opt => opt.MapFrom(src => 
       HttpUtility.HtmlDecode(src.LastName))).ForMember(
      dest => dest.Password, opt => opt.MapFrom(src => 
       HttpUtility.HtmlDecode(src.Password))).ForMember(
      dest => dest.Email, opt => opt.MapFrom(src => 
       HttpUtility.HtmlDecode(src.Email))).ForMember(
      dest => dest.Role, opt => opt.Ignore()).ForMember(
      dest => dest.RoleId, opt => opt.Ignore()).ForMember(
      dest => dest.ModifiedDate, opt => opt.Ignore()).ForMember(
      dest => dest.School, opt => opt.Ignore()).ForMember(
      dest => dest.Language, opt => opt.Ignore()).ForMember(
      dest => dest.LoginDate, opt => opt.Ignore()).ForMember(
      dest => dest.PasswordEncrypted, opt => opt.Ignore()).ForMember(
      dest => dest.PasswordSalt, opt => opt.Ignore()).ForMember(
      dest => dest.TermsAgreedDate, opt => opt.Ignore()).ForMember(
      dest => dest.Identifier, opt => opt.Ignore()).ForMember(
      dest => dest.Title, opt => opt.MapFrom(src => src.UserTitle)).ForMember(
      dest => dest.Gender, opt => opt.MapFrom(src => 
       src.Gender == null ? (Gender?)null : (Gender)src.Gender)); 

但是做这一切的IAM越来越例外就像从 'System.Int32' 到“System.Nullable`1这个 无效的转换

有人能帮忙照顾?

+1

扔给我们一块骨头,至少告诉我们错误的行号。 – Hogan

+0

@Hogan: - 实际上错误是在Mapper.AssertConfigurationIsValid()行中抛出的,但它似乎是从petapoco抛出的。 –

+0

我很惊讶没有人高喊“变性人 - 恐惧症”在你身上!只是去显示它是一个Reddit的东西! – user3791372

回答

4

鼠窝。但我敢打赌,你必须改变这种代码

(int)src.Gender 

(int?)src.Gender 

或全行(这两个地方你这样做)

dest => dest.Gender, opt => opt.MapFrom(src => 
      src.Gender == null ? (int?)null : (int?)src.Gender)); 
+0

我附上了我得到的错误信息图像。你能看一下吗? –

+0

: - 我已经尝试过,就像你说的,但仍然是亚姆获得相同的例外 –

+0

你改变了这两个地方?然后我不知道。 – Hogan

4

public int? Gender { get; set; }

这条线声明性别为可空int

(int)src.Gender线试图强制转换为INT

0

调试起见,忽略性别测绘

dest => dest.Gender, opt => opt.Ignore() 

但我认为这个问题是在SchoolId和LanguageId,你应该正确映射。
有关故障映射的所有必要信息都应在堆栈跟踪中。

0

你为什么不在模型中使用Enum的任何特定原因?

我总是这样做,并没有问题,与Flag Enum Model Binder MVC甚至处理国旗枚举没有打扰!