2016-12-23 4 views
1

Я работаю над созданием приложения asp.net MVC с текстовым полем и двумя выпадающими списками. Пользователи могут вводить числовое значение и выбирать из списка от - до процесса. Моя проблема заключается в попытке проверить выпадающий список, поскольку я пытался использовать необходимую проверку, но не работал. Я также пытался проверить выпадающие списки при отправке нулевых значений, но проверка ошибок не работает!Публикация нулевой проверки из выпадающего списка MVC

Тип ошибки:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'fromCurrency.Name'. 

Contorller

[HttpPost] 
     public ActionResult Index(Currencies cur) 
     { 
      if (ModelState.IsValid) 
      { 



       if (String.IsNullOrWhiteSpace(cur.fromCurrency.Name) || String.IsNullOrWhiteSpace(cur.toCurrency.Name)) 
       { 
        ModelState.AddModelError(string.Empty, "you can not leave the empty dropdown please select any of these"); 
       } 


       else 
       { 

        var fromCurrencyList = CurrenciesClient.GetFromCurrencyListAsync().Result; 

        ViewBag.FromCurrencies = new SelectList(fromCurrencyList, "CurrencyCode", "Name"); 

        var ToCurrencyList = CurrenciesClient.GetToCurrencyListAsync().Result; 

        ViewBag.ToCurrencies = new SelectList(ToCurrencyList, "CurrencyCode", "Name"); 


        var fromcurrname = cur.fromCurrency.Name; 
        string tocurrname = cur.toCurrency.Name; 

        //rate is taking by passing both dropdown currency code 
        decimal rate = CurrenciesClient.GetConversionRate("Currencies/GetConversionRate?fromcurrname=" + fromcurrname + "&tocurrname=" + tocurrname).Result; 
        ViewBag.TheResult = cur.CurrencyToConvert * rate; 


       } 

      } 
      return View(); 
     } 

Index Просмотр

@model ViewModel.Currencies 

@{ 
    ViewBag.Title = "Index"; 
} 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

    <div id="ConversionSection"> 

     <form class="form-horizontal" method="post" id= "CurrencyConversion" action="/Currency/Index"> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      <div class="form-group"> 
       <label class="col-sm-4 control-label"> 
        @Html.LabelFor(m => m.CurrencyToConvert, "Enter Currency") 
       </label> 
       <div class="col-sm-4"> 
        @Html.EditorFor(m => m.CurrencyToConvert, new { @class = " form-control" }) 
        @*@Html.ValidationMessageFor(m => m.CurrencyToConvert)*@ 
        @Html.ValidationMessageFor(m => m.CurrencyToConvert, "", new { @class = "text-danger" }) 


       </div> 
      </div> 
      <div class="form-group"> 
       <label class="col-sm-4 control-label"> 
        @Html.LabelFor(model => model.fromCurrency.Name, "From Currency") 
       </label> 
       <div class="col-sm-4"> 
        @Html.DropDownListFor(m => m.fromCurrency.Name, ViewBag.FromCurrencies as SelectList, "--select--", new { @class = " form-control" }) 
        @Html.ValidationMessageFor(model => model.fromCurrency.Name) 

       </div> 
      </div> 
      <div class="form-group"> 
       <label class="col-sm-4 control-label"> 
        @Html.LabelFor(model => model.toCurrency.Name, "To Currency") 
       </label> 
       <div class="col-sm-4"> 
        @Html.DropDownListFor(m => m.toCurrency.Name, ViewBag.ToCurrencies as SelectList, "--select--", new { @class = "form-control" }) 
        @*@Html.ValidationMessageFor(model => model.toCurrency.Name)*@ 

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


       </div> 
      </div> 

      <div class="form-group"> 
        <label class="col-sm-4 control-label"> 
         @Html.LabelFor(l => l.ConvertedCurrency, "Value") 
        </label> 
        <div class="col-sm-4"> 
         @Html.Editor("TheResult", new { @class = " form-control" }) 
        </div> 
      </div> 

      <div class="form-group"> 
       <div class="col-sm-offset-2 col-sm-4"> 
        <button type="submit" class="btn btn-success">Submit</button> 
       </div> 
      </div> 

     </form> 


    </div> 

Currencies.cs

public class Currencies 
    { 
     [Required] 
     [DataType(DataType.Currency)] 
     [DisplayFormat(ConvertEmptyStringToNull = false)] 
     public decimal CurrencyToConvert { get; set; } 


     public Currency fromCurrency { get; set; } 

     public Currency toCurrency { get; set; } 

     public double ConvertedCurrency { get; set; } 

    } 

ответ

1

Поскольку ничего не возвращается, если ваше состояние модели недействительно. Таким образом, viewbag.FromCurrencies и Viewbag.ToCurrencies должны быть за пределами if (ModelState.IsValid). Если вы не добавите код свойств суммирования после if(ModelState.IsValid), то через него будет передано пустое значение, и вы получите это исключение. Я пишу здесь реорганизованный код в методе httppost.

[HttpPost] 
     public ActionResult Index(ConvertCurrencyViewModel cur) 
     { 
      if (ModelState.IsValid) 
      { 

        string fromcurrname = cur.fromCurrency.Name; 
        string tocurrname = cur.toCurrency.Name; 

        //rate is taking by passing both dropdown currency code 
        decimal rate = CurrencyClient.GetConversionRate("Currency/GetConversionRate?fromcurrname=" + fromcurrname + "&tocurrname=" + tocurrname).Result; 
        ViewBag.result = cur.CurrencyToConvert * rate; 

      } 
       //getting this select list value form Currency client class 
       var fromCurrencyList = CurrencyClient.GetFromCurrencyListAsync().Result; 

       ViewBag.FromCurrencies = new SelectList(fromCurrencyList, "CurrencyCode", "Name"); 

       var ToCurrencyList = CurrencyClient.GetToCurrencyListAsync().Result; 

       ViewBag.ToCurrencies = new SelectList(ToCurrencyList, "CurrencyCode", "Name"); 

       return View(); 

     } 

И модифицируйте свой класс curreny следующим образом, чтобы показать ошибку проверки.

public class Currencies 
    { 
     [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter amount to convert")] 
     [DataType(DataType.Currency)] 
     [DisplayFormat(ConvertEmptyStringToNull = false)] 
     public decimal CurrencyToConvert { get; set; } 


     [Required(AllowEmptyStrings = false, ErrorMessage = "Please select country Name")] 
     public Currency fromCurrency { get; set; } 

     [Required(AllowEmptyStrings = false, ErrorMessage = "Please select country Name")] 
     public Currency toCurrency { get; set; } 

     public double ConvertedCurrency { get; set; } 
    } 

Это поможет вам проверить ваши поля.

+0

Все работает отлично! Большое спасибо за ответ на вопрос. – Dodi