2012-04-21 12 views
0

私はMVC3を初めて使っていますが、これまでのところ私は自分のコードにぴったり合っています。フォームにモデルに追加してから追加してフォームを再表示します

ここでは、簡単なフォームを作成して、ユーザーが従業員の名前を表すテキスト文字列を入力できるようにしたいと考えています。私はこのフォームを提出して、私のモデルに一種のリストとして保存したいと思います。フォームを再表示し、for-eachループですでに追加されている名前を書き出す必要があります。私が終わったら、私のデータベースにこの情報を保存する必要があります。

私が理解できないことは、私がデータベースにプッシュするまで、この一時的な情報を保存する方法です。私が提出するたびに押す、私はすることができますが、これは頭痛の多くを引き起こしている。

皆さんは私が何をしようとしているのかを見て、それに素晴らしい解決策を持っていることを願っています。 :)

これは私がやろうとしていたものの簡易版である:

モデル

public class OrderModel 
{ 
    public virtual ICollection<Employees> EmployeesList { get; set; } 

    public virtual Employees Employees { get; set; } 
} 

public class Employees 
{ 
    [Key] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

ビュー

@model OrderModel 
@{ 
    if (Model.EmployeesList != null) 
    { 
     foreach (var c in Model.EmployeesList) 
     { 
      @c.Name<br /> 
     } 
    } 
} 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.Employees.Name) 

    <input type="submit" value="Add"/> 
} 

コントローラ

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    model.EmployeesList.Add(model.Employees); 
    // This line gives me the error: "System.NullReferenceException: Object reference not set to an instance of an object." 

    return View(model); 
} 

答えて

1

を私はあなたがページに従業員のリストを燃焼させ、これを処理すべきだと思います。今、あなたはあなたのフォームにリストを認識する方法を与えていません。

従業員の名前EditorTemplatesファイルで:あなたのビューで

@model Employees 

@Html.HiddenFor(m => m.ID) 
@Html.HiddenFor(m => m.Name); 

:ユーザーが持っていたことがないので、このメソッドへの追加ボーナスとして

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.EmployeesList) 
    @Html.TextBoxFor(m => m.Employees.Name) 

    <input type="submit" value="Add"/> 
} 

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    if (model.EmployeesList == null) 
     model.EmployeesList = new List<Employees>(); 

    model.EmployeesList.Add(model.Employees); 
    return View(model); 
} 

、Ajaxを追加するのは簡単だろう新しい従業員を追加するときにページを離れることができます(JavaScriptで新しい隠し値を挿入して、ajaxを避けることができるかもしれません。

+0

ありがとう!このアプローチは完全に機能しました。 – holaq

1

これは、TempDataには適していると思います。そこにはキャッシュのようなものを格納することができますが、キャッシュとは異なり、次の要求までしか持続しません。これを実現するために、このようなアクションメソッド(例のみ)に変更します。

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    dynamic existingItems = TempData["existing"]; 
    if (existingItems != null) 
    { 
     foreach (Employee empl in existingItems) 
      model.EmployeesList.Add(empl); 
    } 
    model.EmployeesList.Add(model.Employees); 
    TempData["existing"] = model.EmployeesList; 
    return View(model); 
} 
+0

"System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。" "model.EmployeesList.Add(model.Employees);"のエラー以前と同じように。私は質問でこれを言及するのを忘れた。 – holaq

+0

@holaq、ポストバック後にmodel.EmployeesListがnullであることは間違いありません。私はそれを作成するために私の答えを更新しました。 (私はICollectionに慣れていないので、私の構文がうまくいくかどうかは分かりません) – McGarnagle

+0

これはうまくいくでしょう。従業員リストが消えるページを更新するだけです。 – DMulligan

関連する問題