在ASP.NET MVC 5网站中,我在视图中填充下拉列表并在POST操作中返回值。但是,ModelState.IsValid始终为false。在调查原因时,我发现IEnumerable<SelectListItem>
属性存在错误,该属性包含下拉列表的数据。
以下是IEnumerable<SelectListItem>
属性的ModelState的例外:
从类型'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 :(得分: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))