3

Hyprlinkrを使用してHTTPPostアクションへのURLを生成しようとしています。私のコントローラーは次のようになります。

public class MyController : ApiController {
    [HttpPost]
    public void DoSomething([FromBody]SomeDto someDto) {
        ...
    }
}

このルートで:

routes.MapHttpRoute(
            name: "MyRoute",
            routeTemplate: "dosomething",
            defaults: new { controller = "My", action = "DoSomething" });

http://example.com/dosomethingという単純なURLを取得することを期待していますが、機能しません。私は2つの方法を試しました:

1)routeLinker.GetUri(c => c.DoSomething(null))-スローNullReferenceException

2)routeLinker.GetUri(c => c.DoSomething(new SomeDto()))-無効なURLを生成します: http ://example.com/dosomething?someDto = Namespace.SomeDto

更新: githubで開かれた問題: https ://github.com/ploeh/Hyprlinkr/issues/17

4

3 に答える 3

1

2番目のオプションは行く方法です:

routeLinker.GetUri(c => c.DoSomething(new SomeDto()))

ただし、POST メソッドを使用する場合は、生成された URL のモデル部分を削除する必要があります。カスタムルートディスパッチャーでそれを行うことができます:

public ModelFilterRouteDispatcher : IRouteDispatcher
{
    private readonly IRouteDispatcher defaultDispatcher;

    public ModelFilterRouteDispatcher()
    {
        this.defaultDispatcher = new DefaultRouteDispatcher("DefaultApi");
    }

    public Rouple Dispatch(
        MethodCallExpression method,
        IDictionary<string, object> routeValues)
    {
        if (method.Method.ReflectedType == typeof(MyController))
        {
            var rv = new Dictionary<string, object>(routeValues);
            rv.Remove("someDto");
            return new Rouple("MyRoute", rv);
        }

        return this.defaultDispatcher.Dispatch(method, routeValues);
    }
}

次に、そのカスタム ディスパッチャーを RouteLinker インスタンスに渡します。

警告: これを書いているのは非常に遅く、上記のコードをコンパイルしようとはしていませんが、さらに数日待つよりも、ここで回答を試みたほうがよいと思いました.

于 2013-03-12T22:59:52.033 に答える