Как вернуть связанные сущности в веб-API и вызвать веб-API из отдельного приложения MVC - PullRequest
0 голосов
/ 12 сентября 2018

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

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

Таким образом, Person может иметь один или несколько Policies.

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

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

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

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

Это мой метод WebApi

Web Api ViewModel

Класс политики

MVC-контроллер, вызывающий метод Web Api

Это представление mvc cshtml. Я отображаю данные из веб-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"><strong>Policy Holder/s</strong></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"><strong>Life Insured</strong></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>
  public Amendments_Interface_VM HttpClientCall(Amendments_Interface_VM value, string uri, int? pklifeinsured)
    {
        var client = new HttpClient { BaseAddress = new Uri(apiURL) };
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var httpresult = client.GetAsync(apiURL).Result;

        if(httpresult.IsSuccessStatusCode)
        {
            var result = httpresult.Content.ReadAsStringAsync().Result;
            var data = JsonConvert.DeserializeObject<Amendments_Interface_VM>(result);
            return data;
        }

        return new Amendments_Interface_VM();
    }

ошибка

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В вашей модели Person вы можете иметь свойство Policies и заполнить его необходимой операцией. Ваша модель должна выглядеть примерно так. Вы можете вернуть все связанные сущности, имея свойство сущности в модели.

    public class Person
    {
        /* public int Id { get; set; }
         * Other properties 
         */

        public List<PolicyHolderVM> policiesLst { get; set; }
    }

Я создал функцию для вызова API. Это вернет объект Person, поступающий из API.

    public Person HttpClientCall(Person value, string uri)
    {
        var client = new HttpClient { BaseAddress = new Uri(_baseUrl) };
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var httpresult = client.GetAsync(uri).Result;

        if (httpresult.IsSuccessStatusCode)
        {
            var result = httpresult.Content.ReadAsStringAsync().Result;
            var data = JsonConvert.DeserializeObject<Person>(result);
            return data
        }

        return new Person();
    }
0 голосов
/ 12 сентября 2018

Я думаю, что вы можете создать модель, как показано ниже, в вашем приложении MVC, а затем вызвать API

public class YourModel
{
    public Person Person{get;set;}
    public List<Policy> Policies {get;set;}
}

, а затем создайте метод webapi для отправки данных в том же формате, что и для модели, или вы даже можете использовать эту же модель в webapi для отправки данных.

теперь в вашем контроллере webapi:

YourModel data=new YourModel();
Person person=new Person();
person.name="test name";
.
.
data.Person=person;
Policy policy1=new Policy();
policy1.name="test name";
.
.
Policy policy2=new Policy();
policy2.name="test name 2";
.
.
data.Policies.Add(policy1);
data.Policies.Add(policy2);

return Ok(data);

надеюсь, это поможет:)

...