猿教程 Logo

ASP.NET MVC中调用Web API Get方法

在前面几节中,我们在“创建包含CRUD操作的Web API接口2:实现Get方法”一节中创建了Web API并实现了各种Get方法来处理不同的HTTP Get请求。

这里我们将在名称为GetAllStudents()的方法中调用一个Web API的Get方法,如下所示。

public class StudentController : ApiController
{
    public StudentController()
    {
    }
    public IHttpActionResult GetAllStudents(bool includeAddress = false)
    {
        IList<StudentViewModel> students = null;
        using (var ctx = new SchoolDBEntities())
        {
            students = ctx.Students.Include("StudentAddress").Select(s => new StudentViewModel()
            {
                Id = s.StudentID,
                FirstName = s.FirstName,
                LastName = s.LastName,
                Address = s.StudentAddress == null || includeAddress == false ? null : new AddressViewModel()
                {
                    StudentId = s.StudentAddress.StudentID,
                    Address1 = s.StudentAddress.Address1,
                    Address2 = s.StudentAddress.Address2,
                    City = s.StudentAddress.City,
                    State = s.StudentAddress.State
                }
            }).ToList<StudentViewModel>();
        }
        if (students.Count == 0)
        {
            return NotFound();
        }
        return Ok(students);
    }
}

上述GetAllStudents()操作方法将处理HTTP GET请求http://localhost:64189/api/student,将返回一个学生列表。

我们将发送这个HTTP请求ASP.NET MVC,控制器得到所有学生记录后将在MVC视图中显示它们。

结果视图如下所示:


以下是在前面章节中创建的一个Web API MVC项目结构。在这个项目中我们将添加必要的类。


我们已经在Models文件夹中创建了以下StudentViewModel类。

public class StudentViewModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
        
    public AddressViewModel Address { get; set; }
    public StandardViewModel Standard { get; set; }
}


让我们一步一步地使用以上Web API到ASP.NET MVC应用程序。

第一步:

首先,在控制器文件夹中创建名为StudentController的MVC控制器类如下所示。右键单击控制器文件夹>添加. .>选择控制器。

public class StudentController : Controller
{
    // GET: Student
    public ActionResult Index()
    {            
        return View();
    }
}

第二步:

我们需要在操作方法中使用HttpClient访问Web API如下所示。详细了解HttpClient点这里。

public class StudentController : Controller
{
    // GET: Student
    public ActionResult Index()
    {
        IEnumerable<StudentViewModel> students = null;
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:64189/api/");
            //HTTP GET
            var responseTask = client.GetAsync("student");
            responseTask.Wait();
            var result = responseTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<IList<StudentViewModel>>();
                readTask.Wait();
                students = readTask.Result;
            }
            else //web api sent error response 
            {
                //log response status here..
                students = Enumerable.Empty<StudentViewModel>();
                ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
            }
        }
        return View(students);
    }
}

第三步:

现在,我们需要添加Index视图。右键单击Index操作方法,并选择“Add View”选项。这将打开添加视图弹窗如下所示。

现在,在Template中选择List,并指定Model类型。


单击Add在视图文件夹中添加Index视图。这将生成以下Index.cshtml。

@model IEnumerable<WebAPIDemo.Models.StudentViewModel>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)
        </th>
    <th></th>
    </tr>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
        </tr>
    }
</table>

从视图中删除细节链接,因为我们不会创建详细信息页面。现在,运行应用程序,您将在浏览器中看到学生列表如下所示。



显示异常信息

我们已经在上面的教程中成功地在页面中显示了学生记录,但如果Web API返回了异常,我们该怎么处理呢?

如果要在MVC视图中显示出相应的异常信息,可以添加ValidationSummary()如下所示。

@model IEnumerable<WebAPIDemo.Models.StudentViewModel>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)
        </th>
    <th></th>
    </tr>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.Id })
            </td>
        </tr>
    }
    <tr>
        <td>
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        </td>
    </tr>
        
</table>

在上面,我们在表的最后一行添加@Html.ValidationSummary(true, "", new { @class = "text-danger" })。这个的作用是如果Web API返回除了200 OK状态码的异常信息,他将显示异常消息。请注意,我们在骤2中StudentController的Index()中增加了model error。

现在,如果Web API返回任何异常,那么学生列表视图将显示下面的消息。


在下一节中,我们学习在Asp.netMVC应用中通过调用Web API的Post方法来向数据库中插入一条新的记录。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html