Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC ModelState对IEnumeration有错误<;选择列表项>;视图模型_Asp.net Mvc_Drop Down Menu - Fatal编程技术网

Asp.net mvc ASP.NET MVC ModelState对IEnumeration有错误<;选择列表项>;视图模型

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”的参数转换失败,因为没有类型转换器可以在这些类型之间转换 从我所读到的内容来看,我似乎正确地使用了视图模

在ASP.NETMVC5网站中,我在视图中填充下拉列表,并在POST操作中返回值。但是,ModelState.IsValid始终为false。在调查原因时,我发现
IEnumerable
属性存在错误,该属性包含下拉列表的数据

以下是ModelState中
IEnumerable
属性的例外情况:

从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败,因为没有类型转换器可以在这些类型之间转换

从我所读到的内容来看,我似乎正确地使用了视图模型,并且正确地设置了下拉列表

这很不方便,因为ModelState.IsValid在其他地方被检查以进行错误处理,但在操作后可用属性是不相关的。您知道为什么
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
)