1

私は2つのモデルを持っています:-

public class Builder    
{  
    [Key]  
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]  
    public int BuilderId { get; set; }  
    public string BuilderName { get; set; }  
}
public class Project
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ProjectId { get; set; }

    [Required]
    public string ProjectName { get; set; }

    [Required]
    public string Location { get; set; }

    [Required]
    public int BuilderId { get; set; }

    public Builder builder { get; set; }
}

ビルダー クラス オブジェクトをクライアント側から Web API メソッドにポストしようとすると、本体からオブジェクトが読み取られます。それで問題ありません。しかし、ビルダーでプロジェクトを追加しようとすると、目的のメソッドが呼び出されません。そして私のWebメソッド:-

public HttpResponseMessage PostProject([FromUri] Project project)
       {
        if (ModelState.IsValid)
        {
            db.Projects.Add(project);
            db.SaveChanges();
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, project);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = project.ProjectId }));
            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

Web APIメソッドを呼び出す私のメソッド:-

public async Task<ActionResult> Create(Project projects)
    {

        try
        {
            HttpClient client = new HttpClient();
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            String contentStr = serializer.Serialize(projects);

            ObjectContent content = new ObjectContent(typeof(Project), projects, new JsonMediaTypeFormatter());

            HttpResponseMessage putResponse = await client.PostAsync(serviceprovider + "project/postproject", content);

            putResponse.EnsureSuccessStatusCode();

            return RedirectToAction("Index");

        }
        catch (HttpRequestException e)
        {
            return View();
        }
    }

私の知る限り、オブジェクトが複雑であるため、問題が発生していると思います。私は Web API を初めて使用します。あなたからの提案は大歓迎です。助けてください。

4

1 に答える 1

1

モデルにネストされたクラス タイプのオブジェクト プロパティがあり、それを URI で渡そうとしました。私は同様の問題を抱えていました.私の働いていたモデルの1つはあなたのものとまったく同じ構造でした. 要求本文でシリアル化された JSON または XML を渡さない限り、解決策はありませんでした。そこで、FieldValueModelBinder クラスというカスタム モデル バインダーを作成しました。あなたが提示したモデル、つまりコレクションのないオブジェクト階層では、それは非常に簡単に機能します。データ量は多くないので、データを URI で渡すのはかなり良い方法です。

私の記事を読んで、このリンクを使用して投稿したばかりのソース コードをダウンロードしてください: http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects。これがあなたが必要とする理想的なソリューションであることを願っています。

于 2013-12-26T20:34:05.257 に答える