Member 11993385 Ответов: 0

Как вернуть связанные сущности в web api и вызвать web api из отдельного приложения MVC


Как я могу вернуть сущность с ее связанными сущностями в методе Web API и вызвать ее из приложения MVC?

У меня есть веб-API, в котором я возвращаю сущность Person, а также возвращаю все политики, связанные с этой сущностью person.

Таким образом, у человека может быть один или несколько полисов.

До сих пор я могу сделать это в своем контроллере Web API.

Проблема заключается в вызове моего веб-API в отдельном приложении MVC.

В настоящее время я могу вернуть только запись Person в моем приложении MVC, я изо всех сил пытаюсь вернуть Person и все связанные с ним политики в моем приложении MVC.

В моем представлении MVC .cshtml я вызываю ViewModel для передачи данных во все поля веб-API.


[Route("{pklifeinsured}")]
public IHttpActionResult GetRec(int pklifeinsured)
{
    var model = new Amendments_Interface_VM();
    using (var db = new TestLiveEntities())
    {
        var ctx = db.LifeInsureds.Where(l => l.pkLifeInsured == pklifeinsured).FirstOrDefault();
        if (ctx != null)
        {
            model = new Amendments_Interface_VM
            {
                pkLifeInsured = ctx.pkLifeInsured,
                IdNumber = ctx.IdNumber,
                Surname = ctx.Surname,
                FirstName = ctx.FirstName,
                Initials = ctx.Initials,
                fkGender = ctx.fkGender,
                DateOfBirth = ctx.DateOfBirth,
                fkTitle = ctx.fkTitle,
                fkMaritalStatus = ctx.fkMaritalStatus,
                fkSmokerStatus = ctx.fkSmokerStatus,
                fkLanguage = ctx.fkLanguage,
                fkCommunicationMethod = ctx.fkCommunicationMethod,
                Mobile = ctx.Mobile,
                HomeTel = ctx.HomeTel,
                EmailHome = ctx.EmailHome,
                WorkTel = ctx.WorkTel,
                EmailWork = ctx.EmailWork,
                Postal_AddressLine1 = ctx.Postal_AddressLine1,
                Postal_AddressLine2 = ctx.Postal_AddressLine2,
                Postal_AddressLine3 = ctx.Postal_AddressLine3,
                Postal_AddressLine4 = ctx.Postal_AddressLine4,
                Postal_AddressLine5 = ctx.Postal_AddressLine5,
                Physical_AddressLine1 = ctx.Physical_AddressLine1,
                Physical_AddressLine2 = ctx.Physical_AddressLine2,
                Physical_AddressLine3 = ctx.Physical_AddressLine3,
                Physical_AddressLine4 = ctx.Physical_AddressLine4,
                Physical_AddressLine5 = ctx.Physical_AddressLine5
            };
            model.PolicyHolder = db.PolicyHolders.Where(x => x.fkLifeInsured == pklifeinsured).Select(p => new PolicyHolderVM
            {
                PolicyNumber = p.PolicyNumber,
                DOC = p.DOC,
                fkLifeInsured = p.fkLifeInsured,
                PolicyStatus = p.PolicyStatus,
                RelationshipToLifeInsured = p.RelationshipToLifeInsured,
                Package = p.Package,
                Name = p.Name,
                ContactNumber = p.ContactNumber,
                ID_Reg_Num = p.ID_Reg_Num,
                EmailAddress = p.EmailAddress
            }).ToList();
        }
    }
    return Ok(model);
}



public class Amendments_Interface_VM
{
    public int pkLifeInsured { get; set; }
    public string FirstName { get; set; }
    public string Initials { get; set; }
    public string Surname { get; set; }
    public string fkTitle { get; set; }
    public string fkGender { get; set; }
    public string IdNumber { get; set; }
    public Nullable<System.DateTime> DateOfBirth { get; set; }
    public string fkMaritalStatus { get; set; }
    public string fkSmokerStatus { get; set; }
    public string fkLanguage { get; set; }
    public string fkCommunicationMethod { get; set; }
    public string WorkTel { get; set; }
    public string Mobile { get; set; }
    public string EmailWork { get; set; }
    public string HomeTel { get; set; }
    public string EmailHome { get; set; }
    public string Postal_AddressLine1 { get; set; }
    public Nullable<int> PA1_Id { get; set; }
    public string Postal_AddressLine2 { get; set; }
    public Nullable<int> PA2_Id { get; set; }
    public string Postal_AddressLine3 { get; set; }
    public Nullable<int> PA3_Id { get; set; }
    public string Postal_AddressLine4 { get; set; }
    public Nullable<int> PA4_Id { get; set; }
    public string Postal_AddressLine5 { get; set; }
    public Nullable<int> PA5_Id { get; set; }
    public string Physical_AddressLine1 { get; set; }
    public Nullable<int> PhyA1_Id { get; set; }
    public string Physical_AddressLine2 { get; set; }
    public Nullable<int> PhyA2_Id { get; set; }
    public string Physical_AddressLine3 { get; set; }
    public Nullable<int> PhyA3_Id { get; set; }
    public string Physical_AddressLine4 { get; set; }
    public Nullable<int> PhyA4_Id { get; set; }
    public string Physical_AddressLine5 { get; set; }
    public Nullable<int> PhyA5_Id { get; set; }

    public IList<PolicyHolderVM> PolicyHolder { get; set; }

}



  public class PolicyHolderVM
{
    public int PolicyNumber { get; set; }
    public Nullable<System.DateTime> DOC { get; set; }
    public int fkLifeInsured { get; set; }
    public string PolicyStatus { get; set; }
    public string RelationshipToLifeInsured { get; set; }
    public string Package { get; set; }
    public string Name { get; set; }
    public string ContactNumber { get; set; }
    public string ID_Reg_Num { get; set; }
    public string EmailAddress { get; set; }
}



    public ActionResult Index(int? pklifeinsured)
{
    var LifePolicy = new Amendments_Interface_VM();

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(apiURL);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = client.GetAsync($"{apiURL}/api/LifePol/{pklifeinsured}").Result;

        if (response.IsSuccessStatusCode)
        {
            LifePolicy = response.Content.ReadAsAsync<Amendments_Interface_VM>().Result;
        }
    }
    return View(LifePolicy);
}



@model WebApiTest_Invoke.Models.Amendments_Interface_VM

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<div class="panel-group" id="MainScreen">

    <div class="panel panel-default">
        <div class="panel-heading">
            <a data-toggle="collapse" data-parent="#MainScreen" href="#collapse1">Policy Holder/s</a>
        </div>
    </div>
    <div id="collapse1" class="panel-collapse collapse in">
        <div class="panel-body">
            <table class="table table-bordered">
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.PolicyNumber)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.PolicyNumber)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.DOC)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.DOC)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.fkLifeInsured)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.fkLifeInsured)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.PolicyStatus)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.PolicyStatus)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.RelationshipToLifeInsured)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.RelationshipToLifeInsured)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.Package)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.Package)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.Name)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.Name)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.ContactNumber)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.ContactNumber)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.ID_Reg_Num)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.ID_Reg_Num)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.EmailAddress)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.EmailAddress)
                    </td>
                </tr>
                <tr>
                </tr>
            </table>
        </div>
    </div>



    <div class="panel panel-default">
        <div class="panel-heading">
            <a data-toggle="collapse" data-parent="#MainScreen" href="#collapse2">Life Insured</a>
            <h3 class="panel-title">
                @using (Html.BeginForm("Index", "LifePol", FormMethod.Get))
                {
                    <p style="padding-left:700px;">
                        Policy Number: @Html.TextBox("pklifeinsured")
                        <input type="submit" value="Search" />
                    </p>
                }
            </h3>
        </div>
    </div>
    <div id="collapse2" class="panel-collapse collapse in">
        <div class="panel-body">
            <table class="table table-bordered">
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.Surname)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.Surname)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.fkGender)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.fkGender)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.FirstName)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.FirstName)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.fkSmokerStatus)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.fkSmokerStatus)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.fkTitle)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.fkTitle)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.DateOfBirth)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.DateOfBirth)
                    </td>
                </tr>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.IdNumber)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.IdNumber)
                    </td>
                    <th>
                        @Html.DisplayNameFor(model => model.Mobile)
                    </th>
                    <td>
                        @Html.DisplayFor(model => Model.Mobile)
                    </td>
                </tr>
                <tr>
                </tr>
            </table>
        </div>
    </div>
</div>


Что я уже пробовал:

Я попытался использовать прилагаемый код, но он не может десериализовать данные в моем приложении mvc.project

littleGreenDude

Захватите результат JSON и поместите его на этот сайт, http://json2csharp.com/
Сравните объект, который они создают, с тем, который есть у вас.

Member 11993385

Проблема, с которой я столкнулся прямо сейчас, заключается в вызове моего контроллера WebApi в отдельном приложении mvc. Я действительно зашел на сайт, который вы предложили, и изменил свою модель, чтобы она была такой же, но я все еще не могу получить результаты от WebApi в моем приложении mvc

Richard Deeming

Не решение вашей проблемы, но вы не должны использовать .Result чтобы получить результат async метод. Вместо этого сделайте свое действие async, и использовать await:

public async Task<ActionResult> Index(int? pklifeinsured)
{
    var LifePolicy = new Amendments_Interface_VM();

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(apiURL);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await client.GetAsync($"{apiURL}/api/LifePol/{pklifeinsured}");

        if (response.IsSuccessStatusCode)
        {
            LifePolicy = await response.Content.ReadAsAsync<Amendments_Interface_VM>();
        }
    }
    
    return View(LifePolicy);
}

0 Ответов