Asp.net mvc ASP.NET MVC ModelState对IEnumeration有错误<;选择列表项>;视图模型
在ASP.NETMVC5网站中,我在视图中填充下拉列表,并在POST操作中返回值。但是,ModelState.IsValid始终为false。在调查原因时,我发现Asp.net mvc ASP.NET MVC ModelState对IEnumeration有错误<;选择列表项>;视图模型,asp.net-mvc,drop-down-menu,Asp.net Mvc,Drop Down Menu,在ASP.NETMVC5网站中,我在视图中填充下拉列表,并在POST操作中返回值。但是,ModelState.IsValid始终为false。在调查原因时,我发现IEnumerable属性存在错误,该属性包含下拉列表的数据 以下是ModelState中IEnumerable属性的例外情况: 从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败,因为没有类型转换器可以在这些类型之间转换 从我所读到的内容来看,我似乎正确地使用了视图模
IEnumerable
属性存在错误,该属性包含下拉列表的数据
以下是ModelState中IEnumerable
属性的例外情况:
从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败,因为没有类型转换器可以在这些类型之间转换
从我所读到的内容来看,我似乎正确地使用了视图模型,并且正确地设置了下拉列表
IEnumerable
属性总是有这个错误吗
我制作了一个简单的网站来复制这个问题
视图模型
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; }
}
}
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.Web.Mvc;
命名空间SandboxAspNet.Models
{
公共类HomeViewModel
{
[必需(ErrorMessage=“请选择一个状态。”)]
[显示(Name=“State”)]
公共字符串SelectedState{get;set;}
公共IEnumerable AvailableEstates{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"
}
};
}
}
}
使用System.Collections.Generic;
使用System.Web.Mvc;
使用SandboxAspNet.Models;
命名空间SandboxAspNet.Controllers
{
公共类HomeController:控制器
{
[HttpGet]
公共行动结果索引()
{
var模型=新的HomeViewModel()
{
AvailableEstates=GetAvailableEstates()
};
返回视图(模型);
}
[HttpPost]
公共行动结果提交(HomeViewModel)
{
如果(!ModelState.IsValid)
{
model.AvailableStates=GetAvailableStates();
返回视图(“索引”,模型);
}
返回视图(“成功”);
}
//为下拉列表生成一些虚拟数据
私有静态IEnumerable GetAvailableEstates()
{
返回新列表()
{
新建SelectListItem()
{
Text=“阿拉巴马”,
Value=“AL”
},
新建SelectListItem()
{
Text=“阿拉斯加”,
Value=“AK”,
},
新建SelectListItem()
{
Text=“亚利桑那”,
Value=“AZ”,
},
新建SelectListItem()
{
Text=“Arkanasas”,
Value=“AR”
}
};
}
}
}
看法
@model SandboxAspNet.Models.HomeViewModel
@{
ViewBag.Title=“主页”;
}
@使用(Ajax.BeginForm(“Submit”、“Home”、Model、null))
{
@Html.ValidationSummary()
@Html.LabelFor(model=>model.SelectedState)
@Html.DropDownListFor(model=>model.SelectedState,model.AvailableStates,“--选择一个状态----”,新的{@type=“text”,@style=“width:100%;”,@class=“form control”})
@Html.ValidationMessageFor(model=>model.SelectedState)
提交
}
您的Ajax.BeginForm()
的第三个参数是错误的
如果不需要做任何更高级的操作,您可以将第三个和第四个参数null
@使用(Ajax.BeginForm(“Submit”,“Home”,Model,null))
仅出于测试目的,使用HttpPost
方法中的HomeViewModel
字符串更改状态,当ModelState.IsValid为true时,状态为null。此外,在生产代码中,有许多数据被传递回操作处理程序。在生产代码中,模型也作为第三个参数传递进来,而这是基于生产代码的。果不其然,将第三个参数设置为null已经修复了它!谢谢我将询问为什么最初在生产代码中是这样做的。它只需要使用(Ajax.BeginForm(“Submit”,“Home”)
@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>
}
public static MvcForm BeginForm(
this AjaxHelper ajaxHelper,
string actionName,
string controllerName,
object routeValues,
AjaxOptions ajaxOptions
)