9

一部の ASP.NET MVC エンドポイントを呼び出す PHP および Javascript アプリがいくつかあります。このエンドポイントがあるとしましょう:

public ActionResult DoSomething(bool flag)
{

}

1 または 0 の整数を渡すか、「true」または「false」の文字列を渡すかに関係なく、flag の値と一致するようにします。それを一致させるには、フレームワークのどの部分を実装する必要がありますか?

4

4 に答える 4

9

これを行う最善の方法は、カスタム値プロバイダーを使用することです。完全なカスタム モデル バインダーを使用してこれを行うことはできますが、これは要件に基づくとやり過ぎであり、カスタム値プロバイダーを実装するだけの方がはるかに簡単です。

カスタム モデル バインダーを使用する場合とカスタム値プロバイダーを使用する場合のガイダンスについては、こちらこちらを参照してください。

「フラグ」のキーを持つルート値を処理するカスタム値プロバイダーを作成し、値プロバイダーで int から bool への変換を処理するだけです。これを行うコードは次のようになります。

public class IntToBoolValueProvider : IValueProvider
{
    public IntToBoolValueProvider(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        this._context = context;
    }
    public bool ContainsPrefix(string prefix)
    {
        return prefix.ToLower().IndexOf("flag") > -1;
    }
    public ValueProviderResult GetValue(string key)
    {
        if (ContainsPrefix(key))
        {
            int value = 0;
            int.TryParse(_context.RouteData.Values[key].ToString(), out value);
            bool result = value > 0;
            return new ValueProviderResult(result, result.ToString(), CultureInfo.InvariantCulture);
        }
        else
        {
            return null;
        }
    }
    ControllerContext _context;
}

public class IntToBoolValueProviderFactory : ValueProviderFactory
{
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        return new IntToBoolValueProvider(controllerContext);
    }
}

値プロバイダーでは、ContainsPrefix メソッドを実装して、関心のあるルート値キー (この場合はキー "フラグ") に対して true を返します。GetValue フラグでは、「フラグ」ルート データ エントリの値を int に変換し、次に int がゼロより大きいかどうかに応じてブール値に変換します。「フラグ」ではない他のすべてのルート データ キーについては、null を返すだけで、MVC フレームワークにこの ValueProvider を無視して他の値プロバイダーに移動するように指示します。

これを接続するには、カスタム IntToBoolValueProvider プロバイダーを作成する ValueProviderFactory のサブクラスを実装する必要があります。また、このファクトリを MVC フレームワークに登録する必要があります。静的な ValueProviderFactories クラスを使用して、global.asax でこれを行います。

protected void Application_Start()
{
    ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory());
}

次に、次のようにルートを設定したとします。

routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" });

このルートはリクエストを

http://localhost:60286/Home/Foo/{flag}

アクションメソッドへ

    public ActionResult Foo(bool flag)
    {
        //Implement action method
        return View("Index");
    }

{flag} セグメントが 0 より大きい場合、bool フラグ入力パラメーターは true になり、0 の場合、flag パラメーターは false になります。

MVC カスタム値プロバイダーの詳細については、こちらを参照してください。

于 2013-02-22T16:12:16.213 に答える
0

それを一致させるには、フレームワークのどの部分を実装する必要がありますか?

カスタムモデルのバインダー

于 2013-02-22T15:44:56.023 に答える