2017-09-01 38 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”)' –

相关问题