ASP.NET MVC ModelState在视图模型中IEnumeration 有错误
在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>
}
您对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))
在生产代码中,该模型也是作为第三个参数传入的。果然,将第三个参数设置为null已经修复了它!谢谢!我会询问为什么最初在生产代码中这样做。 – madhatter160
它只需要@using(Ajax.BeginForm(“Submit”,“Home”)' –
只是为了测试目的,在'HttpPost'法'字符串改变'HomeViewModel model' theState' – Hackerman
我这样做了,虽然ModelState.IsValid是真实的,theState为空。另外,在生产代码中,有很多数据被传回给动作处理程序。 – madhatter160