2016-04-04 10 views
1

私の問題は非常に興味深いです。私のコード;ウェブApi <T>方法

public JsonResult<ResultStatus> Post<T>(string query, [FromBody]T value) where T: GelYikaBase 
    { 

     return Json(new ResultStatus()); 
    } 

私は、そのデータベースのオブジェクトを保存する唯一の方法です。しかし、私はこのようにURLの関数を挿入する方法を知らない。

エラー。

{"Message": "An error has occurred." 
"ExceptionMessage": "Cannot call action method 'System.Web.Http.Results.JsonResult`1[GelYikaFreamwork.Data.ResultStatus] Post[T](System.String, T)' on controller 'Gel_Yıka_Servis.Controllers.ServisController' because the action method is a generic method." 
"ExceptionType": "System.InvalidOperationException" 
"StackTrace": " konum: System.Web.Http.Controllers.ReflectedHttpActionDescriptor.InitializeActionExecutor(MethodInfo methodInfo) konum: System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<InitializeProperties>b__4() konum: System.Lazy`1.CreateValue() konum: System.Lazy`1.LazyInitValue() konum: System.Lazy`1.get_Value() konum: System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- Özel durumun oluşturulduğu önceki konumdan başlayan yığın izlemesinin sonu --- konum: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() konum: System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- Özel durumun oluşturulduğu önceki konumdan başlayan yığın izlemesinin sonu --- konum: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() konum: System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- Özel durumun oluşturulduğu önceki konumdan başlayan yığın izlemesinin sonu --- konum: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) konum: System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() konum: System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 
} 
+0

問題は、コントローラがバインドするモデルを知らないことです。 reflectivehttpdescriptorクラスを見てください。あなたのモデルにバインドするデフォルトのbehaviprをオーバーライドすることができます。 – Thomas

+0

どうすればいいですか? –

+0

私は答えを追加しました – Thomas

答えて

0

このアプローチの問題は、Web APIは、オブジェクトをデシリアライズする方法を知らないということである:あなたのケースでは

// My generic method 
void GenericMethod<T>(){} 
... 
// Call the generic method by specifying the type of T: 
GenericMethod<string>() 

:ジェネリックの

一般的な使用法は、このようなことができリクエストを呼び出すときにTのタイプを指定しないように、HttpリクエストからPostメソッドを呼び出します。

ジェネリックメソッドを使用するのではなく、ジェネリックコントローラを持つことができます。

public abstract class GelYikaBase { } 

public class GelYika1 : GelYikaBase{} 

public class GelYika2 : GelYikaBase { } 

あなたはGelYikaBaseから継承したクラスに対処するための汎用コントローラー書くことができます:あなたはこれらのモデルが定義されているとしましょう

これを行う
public class GelYikaBaseController<T> : ApiController where T : GelYikaBase 
{ 
    public JsonResult<ResultStatus> Post(string query, T value) 
    { 
     return Json(new ResultStatus()); 
    } 
} 

public class GelYika1Controller<T> : GelYikaBaseController<GelYika1> { } 

public class GelYika2Controller<T> : GelYikaBaseController<GelYika2> { } 

を、ウェブAPIはGelYikaBaseをデシリアライズする方法を知っていますオブジェクト。

+0

お返事ありがとう、良い一日を! :) –