0

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

我在我的控制器中填充

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

这很好地填充了我的视图

@model TableTennis.ViewModels.CreateMatchViewModel

@{
     ViewBag.Title = "Enter Match Result";
}

@using (Html.BeginForm("Create", "Match", FormMethod.Post))
{
<h4>Player 1</h4>
@Html.DropDownListFor(p => p.Player1ID, Model.PlayerList)   

<h4>Player 2</h4>
@Html.DropDownListFor(p => p.Player2ID, Model.PlayerList)

<h4>Winner</h4>
@Html.DropDownListFor(w => w.WinnerID, Model.Winner)

<h5>Set 1</h5>
@Html.EditorFor(p => p.Score1Set1)
@Html.EditorFor(p => p.Score2Set1)
<h5>Set 2</h5>
@Html.EditorFor(p => p.Score1Set2)
@Html.EditorFor(p => p.Score2Set2)

<h5>Set 3</h5>
@Html.EditorFor(p => p.Score1Set3)
@Html.EditorFor(p => p.Score2Set3)

<input type="submit" value="Add result" />    
}

然后在 Post 上,我在 ModelState 无效的地方进行了一些验证,因此运行以下命令

[HttpPost]
public ActionResult Create(CreateMatchViewModel vm)
{
    try
    {
        if (!ModelState.IsValid)
        {
            vm.PlayerList = CreatePlayerList();
            vm.Winner = CreateWinnerList();
            return View(vm);
        }

但这失败了以下错误,但我不确定如何将 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; }
    }
}

编辑 这使它工作

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

1 回答 1

1

原始答案:问题是在您的 CreatePlayerList() 方法中,您将 id 转换为字符串,因此 MVC 无法根据模型中的 id(即 guid)获取所选项目。Player1ID 和 Player2ID 必须是 ViewModel 中的字符串,无论您在数据库中对它们做什么。

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

于 2013-05-07T18:49:41.977 回答