2017-01-03 7 views
0

これは私が議論したいことです。ASP.NET MVC単一のビューでさまざまなアクションロジックを処理する方法は?

.../browse 
.../brand/audi/a4 
.../category/tail-lights-17 
.../search?t=fog+lamp 

私の現在の解決策は、これらのルートに対して異なるアクションとビューを作成することです。

@if(Model.ShowCarSelection) 
{ 
    @Html.Partial("_CarSelection") 
} 

私はあなたがこのようなシナリオを処理しますか疑問のすべてのビューは、部分的なビューで製品をリストしているが、(私は別の部分図で再びこれを扱うことができると推定)、フィルタリングや車の選択のようないくつかの違いがあります。たとえば、次のようなものはどうですか:

[HttpGet, Route("browse"), Route("/{make}/{model}"), Route("categorySlug")] 
public ActionResult List(string make, string model, string categorySlug, int page = 1, string sort, string filter) 
{ 
    var listVM = new ListVM(); 
    if(!string.IsNullOrEmpty(categorySlug)) 
    listVM.Products = productService.GetByCategorySlug(categorySlug); 
    else if (!string.IsNullOrEmpty(make)) 
    listVM.Products = productService.GetByMakeAndModel(make, model); 
    // other things like filtering, sorting, preparing car selection partial view model etc. 
    return View(); 
} 

しかし、これは私が私に悲しい(悪い)気分にさせる本当に長い行動になります。

誰でもこのようなものに対処すれば、私に指示を与えることができますか?

答えて

1

モデルを作成してビューに渡すと、ビューはコントローラにそのビューを戻します。

public class SearchCriteria 
{ 
    public string Name { get; set; } 
    public string Model { get; set; } 
    public string CategorySlug { get; set; } 
    public int Page { get; set; } 
    public string Sort { get; set; } 
    public string Filter { get; set; } 
} 

そして、あなたのコントローラ:

public ActionResult List(SearchCriteria searchCriteria) 
{ 
    // Let your service make the decision based on searchCriteria 
    productService.Get(searchCriteria); 

    // rest of your code 
} 

いっそので、あなたは、他の検索のためのモデルを使用することができ、この操作を行います。

public abstract class SearchCriteria 
{ 
    public int Page { get; set; } 
    public string Sort { get; set; } 
    public string Filter { get; set; } 
} 

public class CarSearchCriteria : SearchCriteria 
{ 
    public string Name { get; set; } 
    public string Model { get; set; } 
    public string CategorySlug { get; set; } 
} 

EDIT

InをコメントOPは以下を尋ねた:

ビューモデルにURLセグメントをバインドできますか?

クエリ文字列に項目があり、アクションメソッドが複雑な型を予期している場合、クエリー文字列から項目を取り出して何らかの形でそのアクションが期待しているモデルを作成しますか?

はい。 DefaultModelBinderクラスが複合型をパラメータとして持つアクションメソッドに遭遇すると、複合型のパブリックプロパティを取得するためにリフレクションを使用します。次に、各プロパティの名前を使用して、以下の場所で以下の順序で一致するものを探します。それは、プロパティ名 "ID" を探していたイマジン:

  1. Request.Form[]配列、すなわちRequest.Form["id"]
  2. RouteData.Values[]配列、すなわちRequest.Files["id"]
すなわち RouteData.Values["id"]
  • Request.QueryString[]配列、すなわちRequest.QueryString["id"]
  • Request.Files[]配列を、

    一致が見つかると、その値が使用され、これ以上検索されません。したがって、フォームに "id"があり、クエリ文字列に "id"がある場合は、フォームのものを使用します。それらの場所のすべての物件を検索します。あなたのモデルが複雑なプロパティを持っているなら、それは同じことをします。

  • +0

    これはフィルタリングや検索フォームでうまく見えますが、 'SearchCriteria'モデルでPOSTリクエストを行うことはできますが、カテゴリメニューリンクや特定のmake/modelリンクをどのように生成して処理しますか?ビューモデルにURLセグメントをバインドできますか? –

    関連する問題