2016-03-20 4 views
3

チケットを作成しようとすると、チケットの優先度も低くなります。 Priorityのドロップダウンリストをセットアップしましたが、チケットの優先順位の割り当ては機能していないようです。私はそれが私の見解はViewModelsからMVCへの列挙体のバインド

チケット\ Create.cshtmlを\に関係してい疑ってる私はこれを正しくやっているかどうかを確認するために、いくつかの明確化が必要:

を私は私のモデルでは、両方の

が必要です私はチケットと呼ばれるクラスを持っており、それが

public enum Priority 
{ 
    Low, Med, High 
} 
public class Ticket 
{ 
    .... 
} 

Configuration.cs(チケットデータを挿入するためのスニペット)

var tickets = new List<Ticket> 
{ 
    new Ticket { 
     UserID = users.Single(s => s.LastName == "Wan").UserID, 
     CategoryID = categories.Single(c => c.CategoryName == "Con-X").CategoryID, 
     Issue = ("Con-X Login Error"), 
     Priority = Priority.High 
    }, 
    new Ticket { 
     UserID = users.Single(s => s.LastName == "Wan").UserID, 
     CategoryID = categories.Single(c => c.CategoryName == "Desktop").CategoryID, 
     Issue = ("Can't remote access C0123"), 
     Priority = Priority.Med 
    }, 
}; 
列挙型の優先順位を持っています

私のviewmodelでTicketVM私はまた、優先度の列挙型を設定しました。 私はこれを通じて、私のチケットを設定していますので:

  Ticket ticket = new Ticket 
      { 
       UserID = (int)WebSecurity.CurrentUserId, 
       Issue = model.Issue, 
       IssuedTo = model.IssuedTo, 
       CategoryID = model.CategoryID, 
       Priority = model.priority <-- ERROR 
      }; 

エラー:

Cannot implicitly convert type 'RecreationalServicesTicketingSystem.ViewModels.TicketVM.Priority' to 'RecreationalServicesTicketingSystem.Models.Priority'. An explicit conversion exists (are you missing a cast?) RecreationalServicesTicketingSystem

ビューが\チケット\ Create.cshtml

<div class="form-group"> 
     @Html.DropDownListFor(m => m.priority, Model.PriorityList, "Please select the priority") 
    </div> 

のviewmodels \ TicketVM.cs

public class TicketVM 
{ 
    public int UserID { get; set; } 
    [Required(ErrorMessage = "Please enter the description")] 
    public string Issue { get; set; } 
    [Display(Name = "Administrator")] 
    [Required(ErrorMessage = "Please select the Administrator")] 
    public int IssuedTo { get; set; } 
    public IEnumerable<SelectListItem> AdministratorList { get; set; } 
    public int CategoryID { get; set; } 
    public IEnumerable<SelectListItem> CategoryList { get; set; } 

    public enum Priority 
    { 
     LOW = 3, 
     MED = 2, 
     HIGH = 1, 
    } 

    public Priority priority { get; set; } 
    public IEnumerable<SelectListItem> PriorityList 
    { 
     get 
     { 
      var priorityType = typeof(Priority); 
      var priorityValues = Enum.GetValues(priorityType).Cast<Priority>(); 
      var converter = TypeDescriptor.GetConverter(priorityType); 

      return 
       from priorityValue in priorityValues 
       select new SelectListItem 
       { 
        Text = converter.ConvertToString(priorityValue), 
        Value = priorityValue.ToString(), 
       }; 
     } 
    } 
} 

Ti cketController.cs

public ActionResult Create() 
{ 
    TicketVM model = new TicketVM(); 
    ConfigureViewModel(model); 
    return View(model); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(TicketVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
     model.CategoryList = new SelectList(db.Categories, "CategoryID", "CategoryName"); 
     ConfigureViewModel(model); 
     return View(model); 
    } 
    Ticket ticket = new Ticket 
    { 
     UserID = (int)WebSecurity.CurrentUserId, 
     Issue = model.Issue, 
     IssuedTo = model.IssuedTo, 
     CategoryID = model.CategoryID, 
     Priority = model.priority <-- ERROR 
    }; 
    db.Tickets.Add(ticket); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

private void ConfigureViewModel(TicketVM model) 
{ 
    IEnumerable<User> admins = db.Users.Where(u => u.IsAdministrator).OrderBy(u => u.LastName); 
    model.AdministratorList = admins.Select(a => new SelectListItem 
    { 
     Value = a.UserID.ToString(), 
     Text = string.Format("{0} {1}", a.FirstMidName, a.LastName) 
    }); 
    IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName); 
    model.CategoryList = categories.Select(a => new SelectListItem 
    { 
     Value = a.CategoryID.ToString(), 
     Text = a.CategoryName.ToString() 
    }); 
} 
+0

列挙型の変換を必要としないの行を一つだけ列挙型を定義し、あなたのコードでどこでもそれを使用することができますPOSTメソッドのコード:) –

+0

完了!ありがとうございました! – TykiMikk

答えて

2

TicketモデルのenumsモデルとTicketVMモデルのモデルは同じではありません。

1つのオプションは、別のオプションは、1つからキャストすることです

@using RecreationalServicesTicketingSystem.Models 
public class TicketVM 
{ 
    .... 
    public Priority priority { get; set; } // uses the enum from the Models assembly 
} 

あなたはRecreationalServicesTicketingSystem.Modelsからenumを使用する(そして、あなたのTicketVMクラスでenum定義を削除)するようTicketVMにusingステートメントを追加することですもう片方。あなたがオブジェクト初期化子内でこれを必要とするので、値に

private Models.Priority CastPriority(ViewModels.TicketVM.Priority value) 
{ 
    Models.Priority priority = Models.Priority.Low; 
    Enum.TryParse<Models.Priority>(value.ToString(), out priority); 
    return priority; 
} 

をキャストするために、コントローラでプライベートメソッドを作成し、オブジェクト初期化子内の

Ticket ticket = new Ticket 
{ 
    .... 
    CategoryID = model.CategoryID, 
    Priority = CastPriority(model.priority) 
}; 

サイドノート:あなたが生成するためのコードを簡素化することができますIEnumerable<SelectListItem>

public IEnumerable<SelectListItem> PriorityList 
{ 
    get 
    { 
     return Enum.GetNames(typeof(Proprity)).Select(e => new SelectListItem() { Text = e, Value = e }); 
    } 
} 
+0

2番目のオプションを使用すると、最初の移行時にチケットデータがどのように移行されたかについてエラーが発生しますか(configuration.cs参照)。また、2番目のオプションのコードはどこに置くのですか?私は中高生のためにこれを行う必要がありますか? – TykiMikk

+1

Q1:データモデルを変更していないため、いいえ。 Q2: 'Priority = model.priority < - ERROR'を私が示した3行のコードに置き換えてください。 Q3:いいえ。最初のコード行はデフォルト値を設定するだけです。 2番目のコード行は、ビューモデルの列挙型の値をデータモデル列挙型にキャストします。そのため、 'TicketVM.Priority.High'、' priority'の値は 'Models.Priority.High'になります –

+0

エラーの束が、コンマではなく最後にセミコロンを置くので、私はそれを疑っていますか? http://pastebin.com/TUFeNwDu – TykiMikk

1

あなたのViewModel内の別のPriority列挙型では必要ありません。モデルから1つを使用して、対応する参照を追加してください。

しかし、1つの列挙値を別の列挙型の変数に割り当てる必要がある場合は、Priority=(int)model.priorityのようにします。あなたがPriorityをモデル

注ビューモデルLOW = 3MED = 2HIGH = 1ながらLow=0Med=1High=2を持っています。

1

に、あなたがpriorityの二つの異なる列挙型を、持っているようだTicketVM.Priority & Models.Priorityとエラーメッセージは、システムが暗黙的にこれら2つのタイプを変換できないことを示しています。

あなたは `したがって、あなたはあなたがまだ` model.CategoryList =新しいSelectListの(...)を削除していない

関連する問題