ASP.NET MVC ModelState在视图模型

时间:2017-09-01 15:45:49

标签: asp.net-mvc drop-down-menu

在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>
}

1 个答案:

答案 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))