2012-03-13 2 views
0

作成機能を正しく動作させることに問題があります。 SalesPersonとCustomerオブジェクトを持つOrderオブジェクトを作成しようとしています。私は、次のしている私のコントローラでMVC例外を返すページを作成します。

public class OrderViewModel 
{ 
    private sunburstdb db = new sunburstdb(); 

    public Order originalOrder { get; set; } 
    public IList<SelectListItem> SalesPeopleList { get; set; } 
    public IList<SelectListItem> CustomersList { get; set; } 
    public IList<SelectListItem> OrderStatusList { get; set; } 

    public OrderViewModel(Order order) 
    { 
     originalOrder = order; 
    } 
} 

// 
    // GET: /Order/Create 

    public ActionResult Create() 
    { 
     Order order = new Order(); 
     OrderViewModel viewModel = new OrderViewModel(order); 
     //IList<SelectListItem> result = new List<SelectListItem>(); 
     viewModel.SalesPeopleList = new List<SelectListItem>(); 
     foreach (SalesPerson person in db.SalesPeople) 
     { 
      var temp = new SelectListItem(); 
      temp.Text = person.FullName; 
      temp.Value = person.ID.ToString(); 
      viewModel.SalesPeopleList.Add(temp); 
     } 
     //viewModel.SalesPeopleList = new SelectList(result); 
     //result.Clear(); 
     viewModel.CustomersList = new List<SelectListItem>(); 
     foreach (Customer person in db.Customers) 
     { 
      var temp = new SelectListItem(); 
      temp.Text = person.FullName; 
      temp.Value = person.ID.ToString(); 
      viewModel.CustomersList.Add(temp); 
     } 
     //viewModel.CustomersList = new SelectList(result); 

     return View(viewModel); 
    } 

    // 
    // POST: /Order/Create 

    [HttpPost] 
    public ActionResult Create(Order order) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Orders.Add(order); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(order); 
    } 

最後に私の見解は、夫婦とかなり標準である私の次のモデルは、私は、ビューモデルを作成し

public class Order 
{ 
    public int ID { get; set; } 
    public SalesPerson SalesPerson { get; set; } 
    public bool PreviousWork { get; set; } 
    public OrderStatus Status { get; set; } 
    public Customer Customer { get; set; } 
    public List<OrderLineItem> LineItems { get; set; } 
} 

のように見えます注文のデータを入力するフィールドの数。

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Order</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.SalesPerson) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Order.SalesPerson", Model.SalesPeopleList) 
    </div> 
      <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.Customer) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Order.Customer", Model.CustomersList); 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.PreviousWork) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.originalOrder.PreviousWork) 
     @Html.ValidationMessageFor(model => model.originalOrder.PreviousWork) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

私はこれを実行すると、私は次の取得、新しい注文を作成しよう:辞書に渡されたモデルアイテムのタイプが「Models.Order」ですが、しかし、この辞書がモデル」タイプのモデルアイテムが必要です.OrderViewModel '。私はおそらく、私は、このメソッドは、このメソッドのパラメータを変更する必要があると思った:このメソッドは、このオブジェクトに対して定義されたパラメータのないコンストラクタです。誰かが私が間違っていることについてMVCのNoobに何か助けを与えることができますか?

+0

ビューの上部に@model行はありませんか?もしそうなら、それを編集して追加してください。 –

+0

はい、@モデルがあり、私はビューファイル全体を含んでいませんでした。 – azorr

+0

Orderオブジェクト内のすべてのカスタムオブジェクトを、参照されるオブジェクトのIDを保持するint値に変更することによって、これを機能させる方法を理解しました。次に、OrderViewModelで、私はOrderControllerのIDで参照される実際のオブジェクトを設定します。 – azorr

答えて

0

アクションでは、ビューモデルを渡します。 パラメータを持つコンストラクタだけを作成したため、MVCもパラメータなしのコンストラクタであるため、エラーが発生します。

コンストラクタを指定しないと自動的に作成されますが、定義した場合は、望ましくないものを作成しません。

Look here。それは私よりも良く説明する必要があります

+0

お返事ありがとうございます。それは例外をクリアしますが、今ではアクションメソッドを作成すると、ページに指定された値ではなくヌルオーダーオブジェクトを受け取ります... – azorr

+0

ctor()にoriginalOrderのインスタンスを作成しようとしています。私はそれが正しいatmだと試すことはできませんが、私は肯定的です:) – Iridio

+0

サイコロ、私はoriginalOrderを初期化し、まだ空白に戻ってきます。 – azorr

0

自動モデルバインディングのためにモデルパラメータmodelに名前を付ける必要があります。そうしないと、すべてのフォームフィールド名の先頭にorder.が追加されます。また、viewmodelまたはカスタムモデルのバインダーのためのパラメーターのないコンストラクターを用意する必要もあります。デフォルトモデルのバインダはかなりスマートですが、パラメータのないコンストラクタが必要です。

0

モデルバインド中に私のことが起こります。 このような状況をデバッグする最も良い方法は、デフォルトのモデルバインダーを継承し、オブジェクトのデフォルトのモデルバインダーとして設定する(Order)モデルバインダーを実装することです。 より具体的な回答については、より多くの情報を提供してください。

カスタムモデルバインダーのサンプルとして、以下のリンクを使用することができます

と登録 http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/

PS:私の意見では、それはのviewmodelsにモデルを置くための最良の方法ではありません。 でもコマンドやサービスを含む実装がありますので、それはあなた次第です。

関連する問題