0

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

私はこれらのモデルを持っています:

    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; }

    }

そして、ステータスのリストを含む FormViewModel (NerdDinner の例から)

    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
      // ...
    }

ビューでこれらの名前を使用して、ステータスを除いて、問題オブジェクトが部分的にバインドされています。

<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>
4

2 に答える 2

0

予想通り - それは単純なものでした。

ビューを次のように変更しました。

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

そして、「問題」を取るコントローラーの署名 (選択リストにバインドできません!)

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

そして、作成後のアクションで、ステータスに関する問題があります。ステータスは無効ですが(IDのみが含まれています)。問題をデータベースにコミットする前に、次のように issueToAdd を設定します。

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

編集:そして、「適切な」ステータスオブジェクトを取得する必要さえなかったことがわかりました。それは Id にバインドされており、それで十分です。

于 2009-06-24T19:24:30.120 に答える
0

コンピューターでドロップダウン リストを試してみましたが、動作します。コードが選択したアイテムを 2 番目のアイテムに設定しようとしているため、NHibernate が複数のアイテムを戻すようにする必要があります。

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

Lists はゼロベースの索引付けであることを思い出してください。

于 2009-06-24T19:14:55.663 に答える