2016-12-20 3 views
0

Я новичок в MVC и пытаюсь развить денежный обмен, в котором есть текстовое поле и два списка переливов валют для обмена. Я использовал веб-службу API, в которой есть таблица имен валют, страны и значений. Моя проблема заключается в вычислении значения из API после того, как пользователь отправил метод действия после вставки суммы в ConversionRate, поскольку я всегда получаю значение 0! Что я здесь делаю неправильно?Потребляемая стоимость от API

Индекс Действие Метод

[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 веб-сервиса 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; } 
    } 

Index Просмотр

@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> 
} 
+0

сложно сказать. Установили ли вы некоторые точки останова, чтобы вы могли проверять значения, размещенные на странице, и значения, возвращаемые API, чтобы вы могли увидеть, что что-то пустое или 0 где-то неожиданно? – ADyson

+0

Да, я установил точку прерывания, и самая запутанная часть - это все API возвращает граф валют, т. Е. На основе идентификаторов, за исключением значения, которое всегда равно 0! – Dodi

+0

API возвращает список всех валют. Затем вы выбираете первый элемент из списка, который соответствует вашему из/в валюту, и выберите свойство ConversionRate из этого первого элемента. Предполагая, что это на самом деле ваше намерение, вам нужно проверить, правильно ли заполнено ConversionRate, а также правильно ли заполняется cur.Value. Я не вижу, где в это входит свойство count или «Value»? – ADyson

ответ

0

Вы разрешаете пользователю вводить коэффициент конверсии в форме, но затем также просматриваете это в API. Это нелогично. Вы не хотите, чтобы пользователь сам вводил коэффициент конверсии - это данные, которые вы храните для расчета обмена.

То, что вы не получаете от пользователя, - это сумма валюты, которую они хотят обменять. Это выполняется в поле «Значение» в вашей модели ViewModel. Поскольку это не вводится, оно всегда имеет значение 0, и поэтому, когда вы делаете ConversionRate * cur.Value, он всегда возвращает 0. (The ConversionRate в этом уравнении, правильно, тот, который возвращается API, а не тот, который вводится пользователем) ,

Чтобы решить, просто изменить

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

в

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

Ваш UI, вероятно, следует также содержать метку сообщает пользователю, что ввести!

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/131075/discussion-on-answer-by-adyson-consuming-value-from-api). –

Смежные вопросы