我有两种型号: -
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的新手,欢迎您提出任何建议。请帮忙。
答案 0 :(得分:1)
您的模型具有嵌套的类类型对象属性,并且您尝试在URI中传递它。我有类似的问题,我的一个工作模型与你的结构完全相同。除非在请求正文中使用序列化的JSON或XML传递,否则没有可用的解决方案。因此,我创建了一个自定义模型绑定器,FieldValueModelBinder类。它在您呈现的模型中非常好用,即没有任何集合的对象层次结构。由于数据量不大,因此在URI中传递数据非常好。
请阅读我的文章并使用以下链接下载我刚发布的源代码:http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects。我希望这是您需要的理想解决方案。