模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数

帕维尔

我遇到以下问题,我创建了一个应用程序,将游戏类别和游戏本身添加到数据库中。我创建了一个关系,但是不幸的是,当我添加到数据库中时,我得到了一个错误。

模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数的构造函数。

游戏类别模型

using System.Collections.Generic;

namespace relationship.Models
{
    public class GameCategory
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public ICollection<Game> Game { get; set; }
    }
}

游戏模型

namespace relationship.Models
{
    public class Game
    {
        public int GameId { get; set; }
        public string Name { get; set; }

        public GameCategory Category { get; set; }
        public int CategoryId { get; set; }
    }
}

视图模型

using relationship.Models;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace relationship.ViewModels
{
    public class AddGameViewModel
    {     
        [Required]
        public string GameName { get; set; }
        public int CategoryID { get; set; }

        public List<SelectListItem> Categories { get; set; }

        public AddGameViewModel(IEnumerable<GameCategory> categories)
        {
            Categories = new List<SelectListItem>();
            foreach (var catData in categories)
            {
                Categories.Add(new SelectListItem { Text = catData.Name.ToString(), Value = catData.Id.ToString() });
            }
            return;
        }
    }
}

游戏库

using System.Collections.Generic;
using System.Linq;

namespace relationship.Models
{
    public class GameRepository : IGameRepository
    {
        private readonly AppDbContext appDbContext;
        public GameRepository(AppDbContext dbContext)
        {
            appDbContext = dbContext;
        }

        public void AddGame(Game game)
        {
            appDbContext.Games.Add(game);
            appDbContext.SaveChanges();
        }

        public IEnumerable<Game> Games()
        {
            return appDbContext.Games.ToList();
        }
    }
}

最后是GameController

using Microsoft.AspNetCore.Mvc;
using relationship.Models;
using relationship.ViewModels;

namespace relationship.Controllers
{
    public class GameController : Controller
    {
        private readonly IGameRepository gameRepository;
        private readonly ICategoryRepository categoryRepository;

        public GameController(IGameRepository gameRepo, ICategoryRepository catRepo)
        {
            gameRepository = gameRepo;
            categoryRepository = catRepo;
        }

        public IActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public IActionResult Add()
        {
            var addGameViewModel = new AddGameViewModel(categoryRepository.GameCategory());
            return View(addGameViewModel);
        }

        [HttpPost]
        public IActionResult Add(AddGameViewModel addGameViewModel)
        {
            if (ModelState.IsValid)
            {
                GameCategory gameCategory = categoryRepository.GetDetails(addGameViewModel.CategoryID);

                if(gameCategory == null)
                {
                    return NotFound();
                }

                Game game = new Game
                {
                    Name = addGameViewModel.GameName,
                    Category = gameCategory
                };

                gameRepository.AddGame(game);
                return RedirectToAction("Index");
            }
            return View(addGameViewModel);
        }
    }
}

我不知道怎么了。

我的错误画面

在此处输入图片说明

保罗·特纳

无法创建Relationship.ViewModels.AddGameViewModel的实例。模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数的构造函数。

让我们尝试解决此错误。

无法创建Relationship.ViewModels.AddGameViewModel的实例。

不言而喻:模型绑定组件试图创建您类型的实例,但是失败了。

模型绑定的复杂类型

“模型绑定”是指它们被ASP.NET管道绑定。“复杂类型”基本上是不是“基本”如string或的任何类型int您的模型类是复杂的类型。

一定不能抽象

模型绑定系统将希望能够创建类的实例,因此它不能是抽象的。它必须是具体的。您显示的所有类型都是具体的,所以这不是问题。

或值类型

您不能将struct类型与模型绑定一起使用;这只是其局限性之一。幸运的是,您的类型都是所有类,因此您可以忽略它。

并且必须具有无参数的构造函数。

ASP.NET不知道如何向模型构造函数提供参数。它只能做的等效项new T(),因此所有模型类型都必须定义一个具有零参数的构造函数。这就是您看到错误的原因;您的AddGameViewModel类仅定义此构造函数:

public AddGameViewModel(IEnumerable<GameCategory> categories)

C#语言的功能之一是,当您不手动指定构造函数时,它将为您添加一个默认的构造函数。当您在代码中定义构造函数时,不会添加此默认构造函数。

在所有其他模型中,您没有定义任何构造函数,因此编译器会为您添加默认构造函数。如果AddGameViewModel您已添加构造函数,则要解决此问题,还必须添加默认构造函数:

public AddGameViewModel()
{
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ASP .NET Core Razor:模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数

具有Angular JS复杂类型集合属性的MVC模型绑定复杂类型

获取“T”必须是具有公共无参数构造函数的非抽象类型,以便将其用作泛型类型或方法中的参数“T”

T必须是具有公共无参数构造函数的非抽象类型,才能在通用类型或方法中将其用作参数“ TModel”

org.mockito.exceptions.base.MockitoException:请确保类型'UserRestService'具有无参数构造函数

元数据视图必须是具有无参数或字典构造函数的具体类

复杂类型枚举模型绑定

将参数绑定到复杂类型

片段必须具有无参数的构造函数-如果我的片段需要参数怎么办?

具有单个构造函数的自引用数据类型不能为 `Show`n

尝试创建“ EmployeeController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数

具有复杂类型的Python枚举

如何使用接口列表和可能没有值的接口嵌套列表处理复杂类型的模型绑定

WebAPI模型绑定到包含复杂类型列表的复杂类型-从主体

不同的匿名XSL复杂类型具有不同的子元素,并且具有通用名称-Delphi数据绑定和良好的设计?

当结合使用具有自动值的JAXB时,出现Marsheling错误“没有无参数的默认构造函数”

具有类型参数的派生构造函数

错误:必须引用现有的简单或复杂类型

ODATA:未绑定的函数返回带有集合的复杂类型

append 的第一个参数必须是切片;有无类型 nil

朱莉娅:为什么参数类型必须具有外部构造函数?

如何获取ASP.NET Core 2.0 MVC模型绑定器来绑定没有FromBody属性的复杂类型

确保控制器具有无参数的公共构造函数错误

确保控制器具有无参数的公共构造函数

使用Ninject确保控制器具有无参数的公共构造函数

WebApi DI Autofac-确保控制器具有无参数的公共构造函数

统一依赖错误 - 确保控制器具有无参数的公共构造函数

Ninject Web Api“确保控制器具有无参数的公共构造函数。”

构造函数不能具有类型参数。dart(type_parameter_on_constructor)