我有2个表(学生和家长),我想发布数据。我有一个MVC控制器和一个API控制器。 我试图将mvc控制器中的createStudent(StudentViewModel student)操作方法分别路由到API控制器中的PostStudent(StudentViewModel学生),并将createParent(ParentViewModel p)路由到PostParent(ParentViewModel p)。 但是在API控制器中使用两个post方法会使其模糊不清。
我无法通过mvc控制器找到在同一api控制器中使用两种post方法的方法。
这是我在MVC控制器中的代码(名为StudentController)
public ActionResult createStudent()
{
return View();
}
[System.Web.Mvc.HttpPost]
public ActionResult createStudent(StudentViewModel student)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:39673/api/student");
var postTask = client.PostAsJsonAsync<StudentViewModel>("student", student);
postTask.Wait();
var result = postTask.Result;
if (result.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
}
ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
return View(student);
}
public ActionResult createparent()
{
return View();
}
[System.Web.Mvc.HttpPost]
public ActionResult createparent(ParentViewModel p)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:39673/api/Student");
//HTTP POST
var postTask = client.PostAsJsonAsync<ParentViewModel>("parent", p);
postTask.Wait();
var result = postTask.Result;
if (result.IsSuccessStatusCode)
{
return View();
}
}
ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
return View(p);
}
这是我的API控制器(名为StudentController)
public class StudentController : ApiController
{
//POST Student
public IHttpActionResult PostStudent(StudentViewModel student)
{
if (!ModelState.IsValid)
return BadRequest("Invalid data.");
using (var ctx = new MyEntities())
{
ctx.Students.Add(new Student()
{
Name = student.Name,
MobileNO = student.MobileNO
});
ctx.SaveChanges();
}
return Ok();
}
//POST Parent
public IHttpActionResult PostParent(ParentViewModel p)
{
if (!ModelState.IsValid)
return BadRequest("Invalid data.");
using (var ctx = new MyEntities())
{
ctx.Parents.Add(new Parent()
{
StudentID=p.StudentID,
ParentName = p.ParentName,
});
ctx.SaveChanges();
}
return Ok();
}
}
由于
答案 0 :(得分:0)
使用用于注册api端点的默认路由定义,您将访问格式为api/controllername
的端点。基本上,您将使用方法签名(主要参数)和Http动词(GET / POST)的组合来访问其中的方法。因此,您的资源(学生/家长)只需要一个POST方法
我建议您为Student创建一个api控制器,为Parent创建一个api控制器。每个人都可以拥有自己的Post方法。
public class StudentController : ApiController
{
[HttpPost]
public IHttpActionResult Post(StudentViewModel student)
{
return Ok();
}
}
public class ParentController : ApiController
{
[HttpPost]
public IHttpActionResult Post(ParentViewModel parent)
{
return Ok();
}
}
现在使用HttpPost方法调用此/api/student
和/api/parent
。
另一种选择是在同一个控制器中明确地给你的方法提供路由模板。
public class StudentController : ApiController
{
[HttpPost]
[Route("api/student/")]
public IHttpActionResult PostStudent(StudentViewModel student)
{
return Ok();
}
[HttpPost]
[Route("api/parent/")]
public IHttpActionResult PostParent(ParentViewModel p)
{
return Ok();
}
}
现在使用HttpPost方法调用此/api/student
和/api/parent
。
虽然这有效,但我个人更喜欢采用第一种方法,一种api控制器用于资源。对我来说看起来很干净:))
另外,查看代码,看起来你正在从mvc控制器调用web api控制器。如果你的mvc控制器和web api控制器在同一个项目中,而不是进行http调用,为什么不调用一个常用的帮助器方法呢?您可以从web api控制器和mvc控制器调用相同的公共帮助程序,这样您的保存代码只能在一个地方。
此外,您应该尝试async
和await
一直向下以防止死锁。