シンプルなテーブルと高度な検索フォームを含むページがあります。私はモデルに渡しList<Customers>
ます:
View(List<Customers>);
では、検索フォームにデータを渡したり返したりする最良の方法は何ですか? 検証などを使用したいのですが、データを渡すViewData
のはお勧めできません。助言がありますか?
シンプルなテーブルと高度な検索フォームを含むページがあります。私はモデルに渡しList<Customers>
ます:
View(List<Customers>);
では、検索フォームにデータを渡したり返したりする最良の方法は何ですか? 検証などを使用したいのですが、データを渡すViewData
のはお勧めできません。助言がありますか?
ビューに必要なすべてのデータを、そのビューに固有のモデルにラップする必要があります。これの利点は、最初は空の検索基準をモデルに含めることもできますが、検索が投稿されると、モデルに検索基準が自動的に含まれるため、結果を返すときに再ロードできることです。これは、投稿間でも状態を維持するのに役立ちます。
これにより、ビューのすべてのデータをタイプ セーフにViewData
することもできます。
例えば:
public class CustomerSearchViewModel
{
public List<Customer> Customers { get; set; }
// your search criteria if you want to include it
public string SearchFirstName { get; set; }
public string SearchLastName { get; set; }
public int SearchCustomerID { get; set; }
// etc...
}
戻るとList<Customer>
、投稿からモデルに検索基準が既に入力されているため、ビューはデフォルトで検索基準を対応するコントロールに戻すことができます (検索結果と検索入力コントロールが同じビューにあると仮定します)。
たとえば、あなたの投稿では、CustomerSearchViewModel
. あとは、顧客のリストを取得してモデルに追加し、同じモデルを返すだけです。
// assuming you have accepted a CustomerSearchViewModel named model
model.Customers = GetCustomersForSearchCriteria(model.SearchFirstName,
model.SearchLastName, model.SearchCustomerID);
return View(model);
モデル プロパティに検証属性を追加して、MVC に組み込まれている検証を利用することもできます。ViewData
このデータを渡すために を使用していた場合、これは不可能です。
「次の男」も考慮する必要があります。ビューが必要とするすべてのデータが単一のクラスに配置されていると、よりクリーンになります。ViewData
このようにして、コードが使用されているかどうか、実際にどのデータが渡されているかを確認するためにコードを探し回る必要がなくなります。
ViewData
は引き続きデータを渡すためのオプションですが、可能な限り使用を最小限に抑えるようにしています。
アイテムのリストだけをビューに渡すのではなく、アイテムのリストと必要になる可能性のあるその他のデータを含むクラス、つまりViewModelを作成します。
public class CustomerSearchViewModel {
public IEnumerable<Customer> Customers { get; set; }
public string SearchTerm { get; set; }
}
.....
var viewModel = new CustomerSearchViewModel {
Customers = customerList,
SearchTerm = searchTerm
};
return View(viewModel);