2009-06-24 9 views
0

親オブジェクトの値を移入する選択リストの値を取得できないようです。 私は、SelectListと値を必要とするオブジェクトに必要な値にアクセスできるように、バインドするためにラッパーオブジェクトを使用しています。 私は何か基本的なものが欠けていると思っていますが、私はそれを見つけることができません。NHibernateとASP.NetのルックアップリストMVC

public class Status 
    { 
     public virtual int Id { get; protected set; } 
     public virtual string Name { get; set; } 
     public virtual bool IsClosed { get; set; } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 
    public class Issue 
    { 
     public virtual int Id { get; protected set; } 
     public virtual string Title { get; set; } 
     public virtual string Description { get; set; } 
     public virtual Status Status { get; set; } 
     public virtual DateTime CreatedOn { get; set; } 
     public virtual DateTime UpdatedOn { get; set; } 

    } 

そして(NerdDinnerの例から)FormViewModel ...

のようなコントローラの外観上のアクションを作成してマイステータス

public class IssueFormViewModel 
    { 
     public Issue Issue { get; set; } 
     public SelectList Statuses { get; set; } 
     public IssueFormViewModel(Issue issue, IList<Status> statuses) 
     { 
      Issue = issue; 
      Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id); 
     } 

     public IssueFormViewModel() { } 

    } 

のリストを格納する:

私はこれらのモデルを持っています
public ActionResult Create() 
    { 
     IList<Status> statuses; 
     Issue issue = new Issue(); 
     // NHibernate stuff getting a List<Status> 
     return View(new IssueFormViewModel(issue,statuses)); 
    } 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(IssueFormViewModel issueFormView) 
    { // At this point issueFormView.Issue.Status == null 
     // ... 
    } 

My Issueオブジェクトは、これらの名前を使用したステータスを除き、部分的にバインドされています。表示:あなたのコードは、2番目の項目であることを選択した項目を設定しようとしているようにNHibernateは1つの以上のアイテムを復活させていることを確認する必要があり、

<p> 
      <label for="Issue.Title">Title:</label> 
      <%= Html.TextBox("Issue.Title", Model.Issue.Title)%> 
      <%= Html.ValidationMessage("Title", "*") %> 
     </p> 
<p> 
      <label for="Statuses">Status:</label> 
      <!-- also tried "Issue.Status" --> 
      <%= Html.DropDownList("Statuses", Model.Statuses)%> 
      <%= Html.ValidationMessage("Status", "*")%> 
     </p> 

答えて

0

期待通り - 何か簡単でした。

私が見えるようにビューを変更する:「問題」(!SelectListのにバインドすることはできません)

[AcceptVerbs(HttpVerbs.Post)] 
    //public ActionResult Create(IssueFormViewModel issueFormView) 
    public ActionResult Create(Issue issueToAdd) 
    { 

そして、私のポストを取るために

<label for="Status.Id">Status:</label> 
    <%= Html.DropDownList("Status.Id", Model.Statuses)%> 
    <%= Html.ValidationMessage("Status.Id", "*")%> 

とコントローラ署名 - 行動の作成私はステータスに関する問題があります。ステータスは無効ですが(IDだけが含まれています)。

issueToAdd.Status = (from p in GetAllStatuses() 
         where p.Id == issueToAdd.Status.Id 
         select p).First(); 

編集:だから、DBへの問題をコミットする前に、私はこのようなissueToAddを設定し、それは私も「適切な」Statusオブジェクトを取得する必要はありませんでしたが判明しました。それはイドに縛られており、それで十分です。

0

は、私は自分のコンピュータ上のドロップダウンリストを試してみましたが、それが動作します。

Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id); 

インデックス付きベースの再ゼロが表示されていることを忘れないでください。

+0

良いキャッチですが、私はOutOfBounds例外を取得しませんでした。私はテストのために1つ以上の価値があることを保証していました。 – hometoast

関連する問題