Asp.net core NET CORE 3.1 MVC HttpPost控制器操作在视图中的表单提交上获取空参数
我在MVC视图中提交了一个注册表表单,但在调试RegisterViewModel参数时,控制器中的注册表表单始终为空 请回答几个问题: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
@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>
视图
中的模型
与控制器
中的模型相同
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; }
}
}