3

ユーザーが必須フィールドではない性別を選択したいというシナリオがあります。ここで私のUIでは、性別がドロップダウンリストにリストされています。ドロップダウンリストには、男性女性の2つのオプションがあり、オプションのラベルGenderがあります。しかし、性別は私のプロジェクトの列挙型であるため、ユーザーが性別を選択しなかった場合は、データベースにnull値を入力する必要がありますが、残念ながら、キャストの例外のためにiamは入力できません。これを解決しますか?

私はペタポコを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; }
}

そして、私はオートマッパーを使用してユーザーから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へのこの無効なキャストのような例外が発生します

誰か助けてもらえますか?

4

4 に答える 4

5

public int? Gender { get; set; }

この行は、性別を nullable int として宣言します

(int)src.Gender行は int としてキャストしようとします

于 2011-09-01T04:31:56.137 に答える
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 に答える
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 に答える