2

私たちのシステムには、コードと名前を持つ一連の既知の「契約タイプ」があります。

public struct ContractType {
  public string Code { get; set; }
  public string Name { get; set; }
}

このようなメソッドを持つ MVC コントローラーがあります。

[HttpGet]
public ActionResult Search(SearchOptions options) {
   // returns search results
}

SearchOptions多くのパラメータが含まれています (の配列を含むContractType)

public class SearchOptions {
  public ContractTypes[] Contracts { get; set; }
  // other properties
}

SearchOptionsasp.net MVC でコントラクト タイプ コードをモデルのコントラクト タイプの配列に自動的に変換したいと考えています。たとえば、MVC モデル バインダーに次のようなクエリ文字列を取得させたい...

http://abc.com/search?contracts=ABC&contracts=XYZ&foo=bar

SearchOptions次のデータ構造のようになるように入力します

{
  Contracts : [
    { Code : "ABC", Name: "ABC Contract Name" },
    { Code : "XYZ", Name: "XYZ Contract Name" }
  ],
  // other properties
}

コントラクト タイプ コードを受け取り、適切な ContractType を返すメソッドを使用できます。

public ContractType GetContractTypeByCode(string code) {
 // code which returns a ContractType
}

カスタム モデル バインダーを使用する必要があるのか​​、値プロバイダーを使用する必要があるのか​​はっきりしません。どんな助けでも大歓迎です。

4

1 に答える 1

3

ModelBinder を使用する必要があると思います。このようなもの

public class SearchOptionsDataBinder : DefaultModelBinder
{
  public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    if (bindingContext.ModelType == typeof(SearchOptions))
    {
      var baseResult = (SearchOptions)base.BindModel(controllerContext, bindingContext);
      var request = controllerContext.HttpContext.Request;

      baseResult.Contracts = request.QueryString
                                    .GetValues("contracts")
                                    .Select(GetContractTypeByCode)
                                    .Where(c => !string.IsNullOrEmpty(c.Code))
                                    .ToArray();
      return baseResult;
    }

    return base.BindModel(controllerContext, bindingContext);        
  }
} 

次に、カスタム モデル バインダーを Application_Start に追加します。

ModelBinders.Binders.Add(typeof(SearchOptions), new SearchOptionsDataBinder());
于 2013-11-08T19:27:58.280 に答える