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);
}