3

次のようなモデルがあります。

仕事
 - ブランチ  
   - 電話(*)
     - 電話の種類  
     - 番号  
   - 営業時間 (*)     
     - 曜日
     - 作業期間 (*)
       - 時間から
       - 時間に
 - カスタムフィールド (*)
   - 名前
   - 価値
 - 住所
   - 住所欄
   - 街
   - 州
   - ジップ
 -やだやだ

上記のクラス タイプごとにEditor Templateを作成しました。

Business既存または新しいエンティティの両方に対して、構造全体を単一のアクションに投稿して保存する送信フォームを備えた共通のエディター テンプレートが必要です。

  1. Editor Templateは正しいアプローチですか? ダウンライン全体に沿ってフォームを送信するにはどうすればよいですか?
  2. フォーム内の電話番号を追加/削除するための [追加] ボタン[削除]ボタンを作成するにはどうすればよいですか?
  3. コレクション内のアイテムを注文するにはどうすればよいですか (つまり、各電話番号の近くに矢印を表示して、ユーザーがクライアント リスト内で上下に移動できるようにしてから、サーバーでの保存を処理できるようにしたいので、既に解決策があります)。

要するに、私の問題は、サーバーにポストされた正しい値を取得する方法と、クライアントで内部コレクションを変更する方法です。適切なデータがこの方法または別の方法でサーバー上にあると、それを処理する方法がわかります。私の問題は、クライアント側とデータ送信の正しい方法です。

アップデート

基本的に私の質問の最初の部分に答えるこの回答を見ましたが、後者の2つはまだ残っています(追加-削除-注文ボタン-クライアントでのコレクションの管理)。
私の問題は、クライアントのDOMで行を追加/削除/並べ替えする方法ではなく、クライアントデータを変更してサーバーで受信する方法です。アクションは次のようになります。

[HttpPost]
public ActionResult Save(Business business)
{
  /// blah blah
}

アップデート

新しいデータを押し込む方法は次のとおりです。

意見:

@Ajax.ActionLink("Add", "AddCustomField", new AjaxOptions { UpdateTargetId = "customFields", InsertionMode = InsertionMode.InsertAfter })

アクション:

public PartialViewResult AddOpeningTimes()
{
  var ot = new OpeningTimes();
  ot.WorkingPeriods.Add(new WorkingPeriod());
  var e = EditorFor(ot);
  //just here for debugging, the values are both empty strings
  e.ViewData.TemplateInfo.HtmlFieldPrefix = ViewData.TemplateInfo.HtmlFieldPrefix;
  return e;
}
//this method is on the base controller:
protected PartialViewResult EditorFor<TModel>(TModel model)
{
  return PartialView("EditorTemplates/" + typeof(TModel).Name, model);
}

問題はname、適切なフィールドが必要に応じて列挙されていないため ( Branches[0].CustomField[0].Key)、代わりに、単にKey.

4

1 に答える 1

1

私の知る限り、これを行う「簡単な」方法はありません。

ボタンの追加- フォームの一部を作成する JavaScript を配線する必要があります (例: 電話タイプの選択と電話のテキスト ボックス)。その ID/名前を設定します。基本的に、Phone[ ].PhoneType という名前を持つフォームの最後の項目を見つけ、フォームのx新しい部分の値を で適切な値に設定しますx + 1

自分でフォームの一部を生成しないようにするオプションは、非表示の「テンプレート」を作成してコピーすることです。次に、IDと名前を変更します。

[削除] ボタン- 単純に DOM から項目を削除すると、シーケンスにギャップが生じ、MVC はそれを処理する方法を知りません。考えられるアプローチの 1 つは、非表示フィールドを使用してフォーム内のアイテムを削除済みとしてマークし、それをサーバー上で処理することです。

並べ替え- Order というプロパティをこの機能が必要なものに追加し、非表示としてレンダリングし、並べ替え時に JavaScript を使用して変更します。また、アイテムを追加するときにも適切に設定する必要があります。

これらの状況で役立つプロパティは次のとおりです。IsNew、IsUpdated - IsDeleted とともに、サーバーでの処理を比較的簡単にします。

もちろん、それぞれに追加/削除/並べ替え機能が必要なネストされたコレクションがある場合、それを実行してデバッグするのは少し難しくなります。

アップデート

部分ビューをレンダリングするアクションは、コンテキスト (親が Branch オブジェクトなど) を持っていないため、html プレフィックスがどうあるべきかを知ることができません。

AJAX を使用する場合は、html フィールド プレフィックスをパラメーター ( public PartialViewResult AddOpeningTimes(string htmlPrefix)) として送信することをお勧めします。htmlPrefix はBranches[0].CustomField[last_custom_field + 1].. 実際にはあまりクリーンではありませんが、これはおそらく、目的を達成するための最もクリーンな方法です。

于 2013-05-07T18:51:29.820 に答える