2

私は2つのモデルを持っています:

public class Person
{
    public Guid ID { get; set; }
    public string Name { get; set;}
}

public class Event
{
    public Guid ID { get; set; }
    public string EventName { get; set; }
    public virtual Person Owner { get; set; }
}

私はビューモデルを持っています:

public class EventViewModel
{
     public EventViewModel() { }
     public Event EventToEdit { get; set; }
     public SelectList People { get; set; }
}

私はコントローラーを持っています:

public ViewResult Create()
{
     var eve = new Event();
     var vm = new EventViewModel
                 {
                     EventToEdit = eve,
                     People = GetPeopleList(true, eve)
                 }
     return View(vm)
 }

私は私のビューを持っています:

@Html.DropDownListFor(x => x.EventToEdit.Owner, Model.People)

明らかに、それらは読み取り目的でカットされています。

ビューを送信して、ActionResult Create

  1. 所有者の値がありません (リストは正しく設定されています)
  2. ViewModel People も null です

ViewModel を使用するポイントは、ビューとの間で情報をコントローラーに運ぶことです。

第二に、そして最も重要なことは、一体なぜ Owner が適切に設定されていないのかということです。選ぶ人がいます。イベント名はモデルを介して返されるため、ViewModel は多少機能しています...

ありがとう、

4

3 に答える 3

4

まず、次のようにする必要があります。

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)

したがって、Model.People は次のようになります。

new SelectList(source, "ID", "Name", source.ID)
于 2012-12-19T10:56:30.980 に答える
2

HTML をチェックして、HTML のオプション要素の値に何が配置されているかを確認しますEventToEdit.Owner。MVC は文字列と整数しか処理できないと思うので、この値をキャストできないと思われますが、必要に応じてカスタムのモデルバインダーを作成することもできます別のデータ型を使用します。

ASP.Net は、効率を高めるためにドロップダウン リストの入力に使用される値をポストバックしません (こちらを参照)。

個人的には、ドロップダウン リストはあまり役に立たないと思います。データベースから直接データを表示するように設計されているため、必要に応じてコントローラーで SelectList 値を取得するために再クエリを実行し、それらをこの re にリンクすることができます。 -オプション値に単純な ID を配置してリストを照会します。

于 2012-12-19T10:59:16.250 に答える
1

karaxunaの答えを取る:

まず、次のようにする必要があります。

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)

したがって、Model.People は次のようになります。

new SelectList(source, "ID", "Name", source.ID)

そしてそれを拡張します:

新しいビューモデル:

public class EventViewModel
{
    public EventViewModel() { }
    public Event EventToEdit { get; set; }
    public SelectList People { get; set; }
    public Guid SelectedPerson { get; set; }
}

バインディングを表示:

@Html.DropDownListFor(x => x.SelectedPerson, Model.People)

次に、コントローラーで:

var person = _repository.People.FirstOrDefault(x => x.ID.CompareTo(vm.SelectedPerson) == 0);
vm.EventToEdit.Person = person;
_repository.SaveEvent(vm.EventToEdit);

わかりやすくするためにこの回答を書いています。検索に来る人は誰でも完全なページを見たいと思うかもしれません。

于 2012-12-19T13:30:08.210 に答える