C# 使用服务器端重新选择DropDownListFor上的选定项失败,MVC 4验证失败

C# 使用服务器端重新选择DropDownListFor上的选定项失败,MVC 4验证失败,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我有一个创建页面,其中有一个包含玩家的下拉列表 这是我在控制器中填充的 [HttpGet] public ActionResult Create() { var vm = new CreateMatchViewModel { Winner = CreateWinnerList(), PlayerLi

我有一个创建页面,其中有一个包含玩家的下拉列表

这是我在控制器中填充的

[HttpGet]
public ActionResult Create()
{
    var vm = new CreateMatchViewModel
                    {
                        Winner =
                            CreateWinnerList(),
                        PlayerList = CreatePlayerList()
                    }
        ;

    return View(vm);
}

private IEnumerable<SelectListItem> CreatePlayerList()
{
    List<Player> playerList = _playerManagementRepository.GetAllPlayers();
    return playerList.Select(p => new SelectListItem
                                        {
                                            Text = p.Username,
                                            Value = p.Id.ToString()
                                        });
}

private SelectListItem[] CreateWinnerList()
{
    return new[]
                {
                    new SelectListItem {Text = "Player 1", Value = 1.ToString(), Selected = true}
                    , new SelectListItem {Text = "Player 2", Value = 2.ToString(), Selected = false}
                };
}
但这会在出现错误后失败,但我不确定如何将Guid强制转换为SelectedListItem,以便在新的Get请求中再次选择列表中的同一项

具有键“Player1ID”的ViewData项的类型为“System.Guid”,但其类型必须为“IEnumerable”

视图模型

    using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace TableTennis.ViewModels
{
    public class CreateMatchViewModel
    {
        public CreateMatchViewModel()
        {
            Score1Set1 = 0;
            Score1Set2 = 0;
            Score1Set3 = 0;
            Score2Set1 = 0;
            Score2Set2 = 0;
            Score2Set3 = 0;
        }

        public IEnumerable<SelectListItem> PlayerList { get; set; }
        public IEnumerable<SelectListItem> Winner { get; set; }

        [Required]
        public Guid Player1ID { get; set; }

        [Required]
        public Guid Player2ID { get; set; }

        [Required]
        public int WinnerID { get; set; }

        [Required]
        [RegularExpression("[0-9][0-9]?")]
        public int Score1Set1 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score1Set2 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score1Set3 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set1 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set2 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set3 { get; set; }
    }
}
原始答复: 问题是,在CreatePlayerList()方法中,您将id强制转换为字符串,因此MVC无法基于模型中的id(guid)获取所选项目。Player1ID和Player2ID必须是ViewModel中的字符串,无论您在数据库中如何处理它们

从评论中找到的实际答案:
尽管有错误消息的文本,问题并不是Player1ID需要是IEnumerable或IEnumerable,而是列表已从模型中删除,或者列表不包含ID。当ModelState无效时,您(可能)需要检查ViewModel,并确定什么无效以及为什么无效。您可能必须使用ModelState.Remove()来重建模型中的错误。

将其设置为字符串,使具有键“Player1ID”的ViewData项的类型为“System.String”,但必须为“IEnumerable”。嗯,我不确定。我一直在这样做,唯一不同的是,我从头开始创建模型,而不是像你一样重新填充列表。知道什么在你的ModelState中是无效的可能会有帮助。但是你如何在recreate上选择SelectedIndex呢?我在这一个上已经没有油了,但现在开始。我所看到的一切都表明这个错误消息令人困惑。尽管有错误消息的文本,问题并不是Player1ID需要是IEnumerable或IEnumerable,而是列表已从模型中删除,或者列表不包含ID。当ModelState无效时,您需要检查ViewModel,并确定什么无效以及为什么无效。您可能必须使用ModelState.Remove()来重建模型中的错误。我希望这会有帮助。我刚刚浏览了我们的一个项目……因为我们都在这里遇到了难题,请尝试在您的文档中添加“ModelState.Clear();”!ModelState.IsValid块。
[HttpPost]
public ActionResult Create(CreateMatchViewModel vm)
{
    try
    {
        if (!ModelState.IsValid)
        {
            vm.PlayerList = CreatePlayerList();
            vm.Winner = CreateWinnerList();
            return View(vm);
        }
    using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace TableTennis.ViewModels
{
    public class CreateMatchViewModel
    {
        public CreateMatchViewModel()
        {
            Score1Set1 = 0;
            Score1Set2 = 0;
            Score1Set3 = 0;
            Score2Set1 = 0;
            Score2Set2 = 0;
            Score2Set3 = 0;
        }

        public IEnumerable<SelectListItem> PlayerList { get; set; }
        public IEnumerable<SelectListItem> Winner { get; set; }

        [Required]
        public Guid Player1ID { get; set; }

        [Required]
        public Guid Player2ID { get; set; }

        [Required]
        public int WinnerID { get; set; }

        [Required]
        [RegularExpression("[0-9][0-9]?")]
        public int Score1Set1 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score1Set2 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score1Set3 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set1 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set2 { get; set; }

        [RegularExpression("[0-9][0-9]?")]
        [Required]
        public int Score2Set3 { get; set; }
    }
}
if (!ModelState.IsValid)
{
    ModelState.Clear();
    vm.PlayerList = CreatePlayerList();
    vm.Winner = CreateWinnerList();
    return View(vm);
}
if (vm.Player1ID == vm.Player2ID)
{
    ModelState.Clear();
    vm.PlayerList = CreatePlayerList();
    vm.Winner = CreateWinnerList();
    return View(vm);
}