asp.net 核心 2.0 无法 post 简单的形式
asp.net core 2.0 not able to post a simple form
我正在尝试学习 Asp.net Core 2.0 并按照教程创建了一个非常简单的表单,其中只有 1 个 属性,名称客户。我用断点调试我什至无法在 CreateModel
中使用 PostAsync 方法
创建模型
public class CreateModel : PageModel
{
private readonly ApplicationDbContext _db;
[BindProperty]
public Customer Customer { get; set; }
public CreateModel(ApplicationDbContext db)
{
_db = db;
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid) return Page();
_db.Customers.Add(Customer);
await _db.SaveChangesAsync();
return RedirectToPage("/");
}
}
Create.cs.html
@page
@model WebApplication1.Pages.CreateModel
@{
ViewData["Title"] = "Create";
}
<h2>Create</h2>
<p>Enter your name: </p>
<form method="post">
<div asp-validation-summary="All"/>
<div>Name : <input asp-for="Customer.Name"/></div>
<input type="submit"/>
</form>
@section Scripts{
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
客户
public class Customer
{
public int Id { get; set; }
[Required, StringLength(10)]
public string Name { get; set; }
}
ApplicationDbContext
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options) : base (options) { }
public DbSet<Customer> Customers { get; set; }
}
我的 Startup 中的 ConfigureServices 方法 class
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase("dbname"));
services.AddMvc();
}
更新
Here is the full project on GitHub to reproduce the issue : https://github.com/touseefbsb/aspnet_post
当我输入超过 10 个字符时,它永远不会在 postasync 方法中遇到断点,页面上也没有任何反应,它应该向我显示 UI 上的验证错误,但它没有.
当我输入一个少于 10 个字符的名称并按下提交时,它尝试提交(后异步中的断点被击中)但随后它尝试重定向,我得到以下错误页面:
完整 StackTrace:
Microsoft.AspNetCore.Mvc.Internal.RedirectToPageResultExecutor.Execute(ActionContext context, RedirectToPageResult result)
Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResult(ActionContext context)
Microsoft.AspNetCore.Mvc.ActionResult.ExecuteResultAsync(ActionContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeResultAsync>d__19.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResultFilterAsync>d__24.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResourceFilter>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeFilterPipelineAsync>d__17.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeAsync>d__15.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext()
检查 Razor 是否为您生成了防伪令牌。
当您提交表单时,必须验证此令牌,如果您的 cookie 不符合预期,则提交将被拒绝。
更新:
RedirectToPage
方法需要页面的完整路径。
输入错误时JavaScript阻止的表单提交,但不会显示,因为<div asp-validation-summary="All">
缺少关闭</div>
。
我刚刚克隆了您的应用程序,它运行良好。它根据需要将数据保存在 InMemoryDatabase 中。可以在cmd .
中看到结果
查看断点的另一张照片
我正在尝试学习 Asp.net Core 2.0 并按照教程创建了一个非常简单的表单,其中只有 1 个 属性,名称客户。我用断点调试我什至无法在 CreateModel
中使用 PostAsync 方法创建模型
public class CreateModel : PageModel
{
private readonly ApplicationDbContext _db;
[BindProperty]
public Customer Customer { get; set; }
public CreateModel(ApplicationDbContext db)
{
_db = db;
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid) return Page();
_db.Customers.Add(Customer);
await _db.SaveChangesAsync();
return RedirectToPage("/");
}
}
Create.cs.html
@page
@model WebApplication1.Pages.CreateModel
@{
ViewData["Title"] = "Create";
}
<h2>Create</h2>
<p>Enter your name: </p>
<form method="post">
<div asp-validation-summary="All"/>
<div>Name : <input asp-for="Customer.Name"/></div>
<input type="submit"/>
</form>
@section Scripts{
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
客户
public class Customer
{
public int Id { get; set; }
[Required, StringLength(10)]
public string Name { get; set; }
}
ApplicationDbContext
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options) : base (options) { }
public DbSet<Customer> Customers { get; set; }
}
我的 Startup 中的 ConfigureServices 方法 class
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase("dbname"));
services.AddMvc();
}
更新
Here is the full project on GitHub to reproduce the issue : https://github.com/touseefbsb/aspnet_post
当我输入超过 10 个字符时,它永远不会在 postasync 方法中遇到断点,页面上也没有任何反应,它应该向我显示 UI 上的验证错误,但它没有.
当我输入一个少于 10 个字符的名称并按下提交时,它尝试提交(后异步中的断点被击中)但随后它尝试重定向,我得到以下错误页面:
完整 StackTrace:
Microsoft.AspNetCore.Mvc.Internal.RedirectToPageResultExecutor.Execute(ActionContext context, RedirectToPageResult result)
Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResult(ActionContext context)
Microsoft.AspNetCore.Mvc.ActionResult.ExecuteResultAsync(ActionContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeResultAsync>d__19.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResultFilterAsync>d__24.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResourceFilter>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeFilterPipelineAsync>d__17.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeAsync>d__15.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext()
检查 Razor 是否为您生成了防伪令牌。
当您提交表单时,必须验证此令牌,如果您的 cookie 不符合预期,则提交将被拒绝。
更新:
RedirectToPage
方法需要页面的完整路径。
输入错误时JavaScript阻止的表单提交,但不会显示,因为<div asp-validation-summary="All">
缺少关闭</div>
。
我刚刚克隆了您的应用程序,它运行良好。它根据需要将数据保存在 InMemoryDatabase 中。可以在cmd
查看断点的另一张照片