Asp.net core NET CORE 3.1 MVC HttpPost控制器操作在视图中的表单提交上获取空参数

Asp.net core NET CORE 3.1 MVC HttpPost控制器操作在视图中的表单提交上获取空参数,asp.net-core,.net-core,razor-pages,Asp.net Core,.net Core,Razor Pages,我在MVC视图中提交了一个注册表表单,但在调试RegisterViewModel参数时,控制器中的注册表表单始终为空 请回答几个问题: 为什么控制器中RegisterViewModel参数的字段为空 在同一个项目中混合使用RAZOR页面和MVC视图可以吗 他们 为什么标记帮助程序(例如“asp for”)没有被Intellisense标记为绿色(Register.chtml中的标记为蓝色) 观点: @model MyProjectNamespace.Data.ViewModels.Regis

我在MVC视图中提交了一个注册表表单,但在调试RegisterViewModel参数时,控制器中的注册表表单始终为空

请回答几个问题:

  • 为什么控制器中RegisterViewModel参数的字段为空
  • 在同一个项目中混合使用RAZOR页面和MVC视图可以吗 他们
  • 为什么标记帮助程序(例如“asp for”)没有被Intellisense标记为绿色(Register.chtml中的标记为蓝色)
  • 观点:

    @model MyProjectNamespace.Data.ViewModels.RegisterModel
    
    @{
        Layout = "_Layout";
        ViewBag.Title = "User Registration";
    }
    
    <h1>User Registration</h1>
    
    
    <div class="row">
        <div class="col-sm-4">
    
        </div>
    
        <div class="col-sm-4">
            <form method="post">
                <div asp-validation-summary="All" class="text-danger">
                    <div class="form-group">
                        <label class="control-label">Email</label>
                        <input asp-for="Email" class="form-control" type="text" />
                    </div>
                    <div class="form-group">
                        <label class="control-label">Password</label>
                        <input asp-for="Password" class="form-control" type="password" />
                        <span asp-validation-for="Password" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label class="control-label">Confirm Password</label>
                        <input asp-for="ConfirmPassword" class="form-control" type="password" />
                        <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label class="control-label">Company</label>
                        <input asp-for="CompanyID" class="form-control" type="text"/>
                    </div>
    
                    <button type="submit" class="btn btn-primary">Register</button>
                </div>
            </form>
        </div>
    </div>
    
  • 为什么控制器中RegisterViewModel参数的字段为空
  • 这很奇怪,我和你的代码一样。请确保
    视图
    中的
    模型
    控制器
    中的模型相同

  • 在同一个项目中混合使用RAZOR页面和MVC视图可以吗
  • 您可以在同一项目中使用
    MVC
    razor-page
    。您已经在项目中注册了razor页面服务。只需在项目的
    根目录中创建
    页面
    文件夹,然后在此文件夹中创建一个新的Razor页面文件,右键单击此文件夹:
    添加
    ->
    Razor页面

    我以前测试过这个

  • 为什么标记帮助程序(例如“asp for”)没有被Intellisense标记为绿色(Register.chtml中的标记为蓝色)
  • 这取决于你的VS版本

    对于VS 2015,这里是@Murat SEKER

  • 从package manager控制台安装剃须刀工具

    安装软件包
    Microsoft.AspNetCore.Razor.Tools

  • 从marketplace下载并安装。(应关闭visual studio实例)

  • 重新启动visual studio后,
    intellisense
    和着色应该对标记帮助程序起作用


    你能显示RegisterModel类吗?@ShadiNamrouti我添加了模型类。你正在使用
    RegisterViewModel
    ,但我们只能在你的项目中看到
    RegisterModel
    ?不要在
    中放置任何内容谢谢你的建议,它应该是RegisterViewModel,但我后来更改了模型类的名称。我成功了,但创建了另一个项目,不确定这个项目有什么问题。我创建了另一个NetCore3.1MVC,但没有RazorPages项目,同样的代码也可以工作。
    namespace MyProjectNamespace.Controllers
    {
        //[AllowAnonymous]
        public class AccountController : Controller
        {
            private readonly UserManager<ApplicationUser> userManager;
            private readonly SignInManager<ApplicationUser> signInManager;
    
            public AccountController(UserManager<ApplicationUser> userManager,
                                     SignInManager<ApplicationUser> signInManager  )
            {
                this.userManager = userManager;
                this.signInManager = signInManager;
            }
    
            // only one page load, NOT submit
            //[HttpGet]
            public IActionResult Register()
            {
                return View();
            }
    
    
            //answers on submit
            [HttpPost]
            public async Task<IActionResult> Register(RegisterViewModel registerViewModel)
            {
                if (ModelState.IsValid)
                {
                    //create new user
                    var user = new ApplicationUser
                    {
                        UserName = registerViewModel.Email,
                        Email = registerViewModel.Email
                    };
    
                    var result = await userManager.CreateAsync(user, registerViewModel.Password);
    
                    if (result.Succeeded)
                    {
                        await signInManager.SignInAsync(user, isPersistent: false); // create cookie that only lasts for the session
                        return RedirectToAction("index", "home");
                    }
    
                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError("", error.Description); // these errors are added in the view by asp-validation-summary="All"
                    }
                }
                else
                {
                    // re-render the register view and display errors
                }
    
                return View(registerViewModel);
            }
        }
    }
    
    namespace MyProject
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(
                        Configuration.GetConnectionString("DefaultConnection")));
    
                //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                //    .AddEntityFrameworkStores<ApplicationDbContext>();
    
                //services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
                //    .AddEntityFrameworkStores<ApplicationDbContext>();
    
                services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                    .AddEntityFrameworkStores<ApplicationDbContext>();
    
                services.AddRazorPages().AddRazorRuntimeCompilation();
    
                // added for mvc
                services.AddControllersWithViews();
    
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    app.UseDatabaseErrorPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
    
                app.UseRouting();
    
                app.UseAuthentication();
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    // added for razor pages routing
                    endpoints.MapRazorPages();
    
                    // added for mvc routing 
                    endpoints.MapControllerRoute(
                         name: "default",
                         pattern: "{controller}/{action}/{id?}");
                });
            }
        }
    }
    
    namespace MyProjectNamespace.Data.ViewModels
    {
        public class RegisterModel
        {
            [Required]
            [EmailAddress]
            public string Email { get; set; }
    
            [Required]
            [DataType(DataType.Password)]
            public string Password { get; set; }
    
            [DataType(DataType.Password)]
            [Display(Name ="Confirm password")]
            [Compare("Password", ErrorMessage = "Passwords do not match.")]
            public string  ConfirmPassword { get; set; }
    
            public string CompanyID { get; set; }
        }
    }