在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>
}
只是爲了測試目的,在'HttpPost'法'字符串改變'HomeViewModel model' theState' – Hackerman
我這樣做了,雖然ModelState.IsValid是真實的,theState爲空。另外,在生產代碼中,有很多數據被傳回給動作處理程序。 – madhatter160