Asp.Net 核心和脚手架
Posted
技术标签:
【中文标题】Asp.Net 核心和脚手架【英文标题】:Asp.Net Core and Scaffold 【发布时间】:2018-03-03 03:41:35 【问题描述】:Asp.Net Razor Page的自动脚手架生成是否兼容bool数据类型?
我问这个问题,因为我正在学习本教程:https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/model。在某个时刻,在创建 POCO 类、配置 dbContext 和迁移之后,我运行了这个命令来自动生成脚手架
dotnet aspnet-codegenerator razorpage -m Movie -dc MovieContext -udl -outDir Pages\Movies --referenceScriptLibraries
它很漂亮,但如果我的 POCO 类没有 bool 类型,它就可以工作。
示例 POCO 类:
using System;
namespace RazorPagesMovie.Models
public class Movie
public int ID get; set;
public string Title get; set;
public DateTime ReleaseDate get; set;
public string Genre get; set;
public bool Active get; set;
通过这个实现,当我尝试创建电影时,我会得到这个错误:
“CreateModel”不包含“Active”的定义,并且找不到接受“CreateModel”类型的第一个参数的扩展方法“Active”(您是否缺少 using 指令或程序集引用?)
有什么想法吗?
也许是我使用 SQLite 作为数据库这一事实的必要信息...
还有 CreateModel 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Pages.Movies
public class CreateModel : PageModel
private readonly RazorPagesMovie.Models.MovieContext _context;
public CreateModel(RazorPagesMovie.Models.MovieContext context)
_context = context;
public IActionResult OnGet()
Movie = new Movie
Title = "The Good, the bad, and the ugly",
Genre = "Western",
Price = 1.19M,
ReleaseDate = DateTime.Now,
Active = true
;
return Page();
[BindProperty]
public Movie Movie get; set;
public async Task<IActionResult> OnPostAsync()
if (!ModelState.IsValid)
return Page();
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
【问题讨论】:
CreateModel 类的外观如何?您在此处添加了 Movie 类。 示例可以在github.com/aspnet/Docs/blob/master/aspnetcore/tutorials/… 下载,但是必须将 DbContext 更改为 SQLite 并将 POCO 的一个属性更改为 bool 除了您显示的代码之外,您引用Active
的代码中还有其他地方吗?这似乎是一个编译问题,那么它到底出现在哪里?
它出现在网页中,当我点击创建链接时,它是由脚手架创建的。
【参考方案1】:
问题出在这一行:
@html.DisplayNameFor(model => model.Active))
在Create.cshtml
中,model
指的是CreateModel
,而不是Movie
。相反,您需要:
@Html.DisplayNameFor(model => model.Movie.Active))
【讨论】:
【参考方案2】:我在 ASP.NET Core GitHub 站点上提出了这个错误,它在 .NET Core 2.0 中得到了修复: https://github.com/aspnet/Scaffolding/issues/830
但是,它看起来好像没有将修复程序移植到 2.1,所以我在这里提出了一个新错误: https://github.com/aspnet/Scaffolding/issues/855
【讨论】:
以上是关于Asp.Net 核心和脚手架的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 3 和 NHibernate 脚手架
带有现有存储库的 ASP.NET mvc 脚手架并将 POCO 映射到视图模型