ViewModelをpartialViewsに渡してみませんか。部分ビュー固有のデータと検索テキストを保持するために、ViewModelにさまざまなプロパティがあることを確認してください。次に例を示します。
モデル
public class Product
{
public string Name { get; set; }
public string Type { get; set; }
public string Class { get; set; }
}
ViewModel
public class ProductSearch
{
public ProductSearch()
{
q = string.Empty;
Product1 = new Product();
Product2 = new Product();
}
public string q { get; set; }
public Product Product1 { get; set; }
public Product Product2 { get; set; }
}
_Partial1.cshtml
@model Test1.Models.ProductSearch
<div>Product1</div>
@Html.TextBoxFor(a => a.Product1.Name)
_Partial2.cshtml
@model Test1.Models.ProductSearch
<div>Product2</div>
@Html.TextBoxFor(a => a.Product2.Name)
ActualView.cshtml
@model Test1.Models.ProductSearch
@{
ViewBag.Title = "ActualView";
}
<h2>ActualView</h2>
@using (Html.BeginForm())
{
@:SearchText
@Html.TextBoxFor(m => m.q)
Html.RenderAction("_Partial1", Model);
Html.RenderAction("_Partial2", Model);
<input type="submit" runat="server" id="btnSubmit" />
}
一時データ(DB /その他のソースから取得します)
private List<Product> ProductsToSearch()
{
return new List<Product>() { new Product() { Name = "Product One", Class = "A", Type = "High" }, new Product() { Name = "Product Two", Class = "A", Type = "Low" }, new Product() { Name = "Product Three", Class = "B", Type = "High" } };
}
コントローラのアクション
public ActionResult _Partial1(ProductSearch search)
{
Product Product1 = ProductsToSearch().Where(a => a.Class.Equals(search.q) && a.Type.Equals("High")).SingleOrDefault();
search.Product1 = Product1;
return PartialView(search);
}
public ActionResult _Partial2(ProductSearch search)
{
Product Product2 = ProductsToSearch().Where(a => a.Class.Equals(search.q) && a.Type.Equals("Low")).SingleOrDefault();
search.Product2 = Product2;
return PartialView(search);
}
[HttpPost]
public ActionResult ActualView(ProductSearch search)
{
return View(search);
}
public ActionResult ActualView()
{
ProductSearch search = new ProductSearch();
return View(search);
}
ここで、に「A」を入力しSearchText
てヒットSubmit Query
すると、2つの異なる結果が得られます(基本的に一般的な検索テキストが使用され、各部分ビューの検索クエリに基づいて、異なる結果が生成されます)