如何将复杂对象传递给Web API方法?

时间:2012-12-31 12:15:20

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api c#-5.0

我有两种型号: -

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方法时,它正在从body中读取对象。这没有问题。但是当我试图用一些Builder添加任何项目时,它不会调用所需的方法。和我的网络方法: -

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的新手,欢迎您提出任何建议。请帮忙。

1 个答案:

答案 0 :(得分:1)

您的模型具有嵌套的类类型对象属性,并且您尝试在URI中传递它。我有类似的问题,我的一个工作模型与你的结构完全相同。除非在请求正文中使用序列化的JSON或XML传递,否则没有可用的解决方案。因此,我创建了一个自定义模型绑定器,FieldValueModelBinder类。它在您呈现的模型中非常好用,即没有任何集合的对象层次结构。由于数据量不大,因此在URI中传递数据非常好。

请阅读我的文章并使用以下链接下载我刚发布的源代码:http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects。我希望这是您需要的理想解决方案。