2016-06-01 5 views
0

WebApiへのPOST呼び出しで、Created(newオブジェクト)を返そうとしています。しかし、Created in ApiControllerには、オブジェクトを取得して残りの処理しか行えないというシグネチャはありません。webapiでオブジェクトの一意の識別子属性を指定します。モデル

私はのようなものを返す場合、それは正常に動作します:

return Created(newobject.blahid.ToString(), newobject); 

または私はこれを簡素化したい

return CreatedAtRoute("DefaultApi", new { controller = ControllerContext.ControllerDescriptor.ControllerName, id = newobject.blahid.ToString()}, newobject); 

行う場合:

return Created(newobject); 

を私がする必要があるでしょうBaseControllerでメソッドを実装する

public class BaseController : ApiController 
{ 
    protected new CreatedNegotiatedContentResult<T> Created<T>(T content) 
    { 
     var id = GetId(content);//need help here 
     return base.Created(id, content); 
    } 
} 

異なるモデルで異なる方法で呼び出されているオブジェクトの一意の識別子について心配したくありません。 myobjguid、someblahguidなど私はちょうどそれを見つけて "id"としてマークしたいと思うでしょう。私のモデルは

public class Model_A 
{ 
    public List<Model_A> ChildModels { get; set; } 

    [LookForThisAttribute]//I want something like this 
    public Guid Model_AGuid { set; get; } 

    public Guid ? ParentGuid { set; get; } 

    public List<SomeOtherObject> OtherObjects { set; get; } 
} 

ある場合

は、属性([LookForThisAttribute])または私は、これは一意の識別子として想定される男であることを指定するためにすべての私のモデルで設定できるものがあると言うならばI今までそれを探します。

Entity Frameworkの[Key]属性とよく似ています。 Entity Frameworkは、何を呼び出すかに関係なく、主キーとなることを認識します。

GetId(Tコンテンツ)メソッドはオブジェクトを取得し、[LookForThisAttribute]のプロパティの値を返すことができますか?

答えて

0

私は自分自身の属性を書いて、その後BaseControllerでそれを探しました。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public sealed class UniqueIdAttribute: Attribute 
    { 
    } 

そしてBaseController作成したメソッドで:

protected CreatedNegotiatedContentResult<T> Created<T>(T content) 
      { 
          var props =typeof(T).GetProperties().Where(
       prop => Attribute.IsDefined(prop, typeof(UniqueIdAttribute))); 
      if (props.Count() == 0) 
      { 
       //log this 
       return base.Created(Request.RequestUri.ToString(), content); 
      } 
      var id = props.FirstOrDefault().GetValue(content).ToString(); 
      return base.Created(new Uri(Request.RequestUri + id), content); 
} 

ここマークGravellの投稿は私のカスタム属性を持つプロパティの値を取得して私を助け:対応するとともに How to get a list of properties with a given attribute?

をコントローラーの単体テストがうまく動作します。

私のカスタム属性で飾る限り、人々がIDに付けた別の名前について悩ますことなく、すべてのApiControllersからCreated(anyobject);と呼ぶことができます。

関連する問題