2017-09-01 36 views
0

在ASP.NET MVC 5網站中,我在視圖中填充下拉列表並將值返回到POST操作中。但是,ModelState.IsValid始終爲false。在調查爲什麼時,我發現IEnumerable<SelectListItem>屬性有一個錯誤,其中包含下拉數據。ASP.NET MVC ModelState在視圖模型中IEnumeration <SelectListItem>有錯誤

下面是從ModelState中異常的IEnumerable<SelectListItem>屬性:

從類型「System.String」輸入「System.Web.Mvc.SelectListItem」的參數轉換失敗,因爲沒有類型轉換器可以轉換這些類型之間。

從我讀過的內容看來,我正確地使用視圖模型並正確設置下拉菜單。

這是不方便的,因爲ModelState.IsValid是錯誤處理別處檢查,但在POST操作AvailableStates是無關緊要的。任何想法爲什麼IEnumerable<SelectListItem>屬性總是有這個錯誤?

我做了一個複製問題的簡單網站。

視圖模型

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace SandboxAspNet.Models 
{ 
    public class HomeViewModel 
    { 
     [Required(ErrorMessage = "Please select a state.")] 
     [Display(Name = "State")] 
     public string SelectedState { get; set; } 

     public IEnumerable<SelectListItem> AvailableStates { get; set; } 
    } 
} 

控制器

using System.Collections.Generic; 
using System.Web.Mvc; 
using SandboxAspNet.Models; 

namespace SandboxAspNet.Controllers 
{ 
    public class HomeController : Controller 
    { 
     [HttpGet] 
     public ActionResult Index() 
     { 
      var model = new HomeViewModel() 
      { 
       AvailableStates = GetAvailableStates() 
      }; 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Submit(HomeViewModel model) 
     { 
      if (!ModelState.IsValid) 
      { 
       model.AvailableStates = GetAvailableStates(); 
       return View("Index", model); 
      } 

      return View("Success"); 
     } 

     // Generate some dummy data for the drop down 
     private static IEnumerable<SelectListItem> GetAvailableStates() 
     { 
      return new List<SelectListItem>() 
      { 
       new SelectListItem() 
       { 
        Text = "Alabama", 
        Value = "AL" 
       }, 
       new SelectListItem() 
       { 
        Text = "Alaska", 
        Value = "AK", 
       }, 
       new SelectListItem() 
       { 
        Text = "Arizona", 
        Value = "AZ", 
       }, 
       new SelectListItem() 
       { 
        Text = "Arkanasas", 
        Value = "AR" 
       } 
      }; 
     } 
    } 
} 

查看

@model SandboxAspNet.Models.HomeViewModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 

@using (Ajax.BeginForm("Submit", "Home", Model, null)) 
{ 
    @Html.ValidationSummary() 
    <div> 
     <strong>@Html.LabelFor(model => model.SelectedState)</strong> 
     @Html.DropDownListFor(model => model.SelectedState, Model.AvailableStates, "--Select a State---", new { @type = "text", @style = "width:100%;", @class = "form-control" }) 
     @Html.ValidationMessageFor(model => model.SelectedState) 
    </div> 
    <div> 
     <button type="submit">Submit</button> 
    </div> 
} 
+0

只是爲了測試目的,在'HttpPost'法'字符串改變'HomeViewModel model' theState' – Hackerman

+0

我這樣做了,雖然ModelState.IsValid是真實的,theState爲空。另外,在生產代碼中,有很多數據被傳回給動作處理程序。 – madhatter160

回答

1

您對Ajax.BeginForm()第三個參數是錯誤的。 That parameter is for routeValues

public static MvcForm BeginForm(
    this AjaxHelper ajaxHelper, 
    string actionName, 
    string controllerName, 
    object routeValues, 
    AjaxOptions ajaxOptions 
) 

可以可能只是使第三和四個參數null如果你不需要做任何事情,更先進。

@using (Ajax.BeginForm("Submit", "Home", Model, null))

+0

在生產代碼中,該模型也是作爲第三個參數傳入的。果然,將第三個參數設置爲null已經修復了它!謝謝!我會詢問爲什麼最初在生產代碼中這樣做。 – madhatter160

+0

它只需要@using(Ajax.BeginForm(「Submit」,「Home」)' –

相關問題