簡體   English   中英

通過API消費價值

[英]Consuming Value from API

我是MVC的新手,並且正在嘗試開發一個貨幣交換,該貨幣交換具有一個文本框和兩個要交換貨幣的下拉列表。 我使用了具有表的API Web服務,該表包含貨幣名稱,國家和值。 我的問題是,一旦用戶在ConversionRate中插入金額后發布操作方法,就從API計算值,因為我總是得到0值! 我在這里做錯了什么?

索引操作方法

  [HttpPost]
        public ActionResult Index(Currencies cur)
        {
            if (cur.ConversionRate.Equals(null))
            {
                ModelState.AddModelError("", "Please enter a numeric value");
            }

            if (cur.FromCurrencyId == cur.ToCurrencyId)
            {
                //do something if same currecnies and return.
                ModelState.AddModelError("", "Can't make the conversion for the same curreny");
            }
            else
            {
                if (ModelState.IsValid)
                {
                    CurrenciesClient Cur = new CurrenciesClient();
                    var listCurrency = Cur.findAll().ToList();

                    Currencies model = new Currencies();
                    model.FromCurrencies = new SelectList(listCurrency,"FromCurrencyId", "CurrencyName","Value");
                    model.ToCurrencies = new SelectList(listCurrency, "ToCurrencyId", "CurrencyName","Value" );

                    ViewBag.TheResult = listCurrency.Where(c => c.FromCurrencyId == cur.FromCurrencyId && c.ToCurrencyId == cur.ToCurrencyId).FirstOrDefault().ConversionRate * cur.Value;

                    return PartialView("_CurrencyValue");
                }
            }
            return View();
        }

API Web服務CurrenciesClient

public class CurrenciesClient 
    {
        private string base_Url = "http://localhost:51646/api/";

        public IEnumerable<Currencies> findAll()
        {
            try
            {
                HttpClient client = new HttpClient();
                client.BaseAddress = new Uri(base_Url);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = client.GetAsync("currencies").Result;
                if (response.IsSuccessStatusCode)
                {
                    var resposeData = response.Content.ReadAsStringAsync().Result;
                    var Currency = JsonConvert.DeserializeObject<List<Currencies>>(resposeData);
                    return Currency;
                }
                return null;
            }
            catch
            {
                return null;
            }
        }
    }

貨幣VM

  public class Currencies
    {
        public int Id { get; set; }

        [Required(ErrorMessage = " message")]
        public int FromCurrencyId { get; set; }
        public SelectList FromCurrencies { get; set; }

        [Required]
        public int ToCurrencyId { get; set; }
        public SelectList ToCurrencies { get; set; }

        public string CurrencyName { get; set; }

        public string CurrencyCountry { get; set; }


        [Required(ErrorMessage ="Please enter a numeric value")]
        public decimal ConversionRate { get; set; }  

        public decimal Value { get; set; }

        public SelectList AvailableCurrencies { get; set; }
    }

索引檢視

@model Project.ViewModels.Currencies

@{
    ViewBag.Title = "Index";
}
<div id="ConversionSection">

        @using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "post", InsertionMode = InsertionMode.Replace, UpdateTargetId = "ConversionSection" }))
        {
            @Html.AntiForgeryToken()

            @Html.ValidationSummary(true, "", new { @class = "text-danger" })

            @Html.TextBoxFor(m => m.ConversionRate, new { @class = "form-control" })

            @Html.DropDownListFor(m => m.FromCurrencyId, Model.FromCurrencies as IEnumerable<SelectListItem>, new { @class = "form-control" })
            @Html.DropDownListFor(m => m.ToCurrencyId, Model.ToCurrencies as IEnumerable<SelectListItem>, new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.ToCurrencyId, "", new { @class = "text-danger" })
            <br />
            <button type="submit" class="btn btn-primary">Convert</button>
        }

</div>
@section scripts{
   <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
}

您允許用戶在表單中輸入轉化率,然后在API中進行查找。 這是不合邏輯的。 您不希望用戶自己輸入轉化率-這是您為了計算交換而保留的數據。

您沒有讓用戶輸入的是他們想要兌換的貨幣量。 這保存在ViewModel的“值”字段中。 由於未輸入該值,因此它始終默認為0,這就是為什么當您執行ConversionRate * cur.Value它始終返回0。(該等式中的ConversionRate正確地是API返回的值,而不是輸入的由用戶)。

要解決,只需更改

@Html.TextBoxFor(m => m.ConversionRate, new { @class = "form-control" })

@Html.TextBoxFor(m => m.Value, new { @class = "form-control" })

您的UI可能還應該包含一個標簽,告訴用戶輸入什么!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM