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

2 に答える 2

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);
}
于 2012-04-21T04:54:43.113 に答える
1

従業員リストをページに焼き付けることでこれを処理する必要があると思います。現在、あなたはあなたのフォームにリストを認識する方法を与えていません。

Employeesという名前の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を回避できる場合があります。投稿のリストに追加する以外のことをする場合はオンにします)。

于 2012-04-21T05:14:52.177 に答える