将MVC控制器操作方法路由到Web Api控制器中的相应post方法(具有多个post方法的Web Api控制器)

时间:2017-11-26 15:34:16

标签: asp.net-mvc post asp.net-web-api2

我有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();
        }
    }

由于

1 个答案:

答案 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控制器调用相同的公共帮助程序,这样您的保存代码只能在一个地方。

此外,您应该尝试asyncawait一直向下以防止死锁。

看一下这篇文章await vs Task.Wait - Deadlock?