3

我有一个场景,用户想要选择他的性别,这不是必填字段。在我的 ui 中,性别列在下拉列表中,其中有两个选项MaleFemale并有一个可选标签Gender。但是性别是我项目中的一个枚举,所以如果用户没有选择任何性别,则必须将空值输入数据库,但不幸的是,由于某些演员异常,我无法做到这一点任何人都可以帮我解决这个?

我使用 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));

但是在做了所有这些之后,我得到了这样的异常 ,从'System.Int32'到'System.Nullable`1

有人可以帮忙吗?

4

4 回答 4

5

一个老鼠窝。但我敢打赌你必须改变这段代码

(int)src.Gender

(int?)src.Gender

或整行(你做的两个地方)

dest => dest.Gender, opt => opt.MapFrom(src =>
          src.Gender == null ? (int?)null : (int?)src.Gender));  
于 2011-09-01T04:30:02.110 回答
5

public int? Gender { get; set; }

此行将性别声明为可为空的 int

(int)src.Gender行尝试转换为 int

于 2011-09-01T04:31:56.137 回答
0

为了调试,忽略性别映射

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

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

于 2011-09-01T05:18:47.797 回答
0

您没有在模型中使用 Enum 的任何特殊原因?

我总是这样做,并且没有任何问题,使用Flag Enum Model Binder MVC 甚至可以毫不费力地处理标志枚举!

于 2011-09-01T06:46:34.183 回答