【问题标题】:asp.net core 2.0 not able to post a simple formasp.net core 2.0 无法发布简单的表单
【发布时间】:2019-02-19 13:16:40
【问题描述】:

我正在尝试学习 Asp.net Core 2.0,并按照教程创建了一个非常简单的表单,其中只有一个属性,即 客户的名称。我使用断点进行调试,我什至无法在 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("/");
    }
}

创建.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 类中的 ConfigurationServices 方法

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase("dbname"));
    services.AddMvc();
}

更新

这里是 GitHub 上重现问题的完整项目:https://github.com/touseefbsb/aspnet_post

当我输入超过 10 个字符时,它永远不会在 postasync 方法中命中断点,并且页面上也没有任何反应,它应该在 UI 上显示验证错误,但它没有。

当我输入一个少于 10 个字符的名称并按提交时,它会尝试提交(在 postasync 中的断点被命中)但随后它尝试重定向,我得到以下错误页面:

完整堆栈跟踪

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()

【问题讨论】:

  • 它显示某种错误?您的代码没有错误。
  • 我没有收到任何错误我一直单击提交按钮,但没有任何反应,我的 PostAsync 方法的第一行有一个断点,并且没有命中该断点。
  • 我测试了你的代码,一切正常。在运行按钮中选择您的项目名称,当您运行应用程序时,您可能会在 cmd 中看到某种错误。
  • 我已经用 GitHub repo 更新了我的问题,您可以通过克隆 repo @Llazar 来重现问题

标签: c# http-post asp.net-core-2.0 razor-pages


【解决方案1】:

我刚刚克隆了您的应用,它运行良好。它根据需要将数据保存在 InMemoryDatabase 中。 cmd中可以看到结果

断点见另一张照片

【讨论】:

  • 那么它没有达到断点吗?这没有任何意义,因为它必须执行 postasync 方法才能到达 saveasync 方法。
  • 你试过下断点吗,是不是在你的ide中下断点?
  • 我已经编辑了我的答案,见第二张照片。清理浏览器中的缓存。
  • 我再次尝试并更新了我的问题,请看看@Llazar
  • 我没有看到任何变化。
【解决方案2】:

检查 Razor 是否为你生成了防伪令牌。

当您提交表单时,必须验证此令牌,如果您的 cookie 没有预期的,提交将被拒绝。

更新:

RedirectToPage 方法需要页面的完整路径。

当出现输入错误时被 JavaScript 阻止的表单提交但不会显示,因为&lt;div asp-validation-summary="All"&gt; 缺少关闭 &lt;/div&gt;

【讨论】:

  • 我该如何检查?
  • 嗯,这只是一个猜测,但似乎并非如此。但是,要使重定向起作用,您必须指定完整路径 RedirectToPage("/Index")
  • 是的@Ranopano,你是对的。我在我的解决方案中添加了重定向,但无助于达到断点。
  • @touseefbsb,您似乎忘记在此处添加结束 div:&lt;div asp-validation-summary="All"&gt;&lt;/div&gt;。如果没有该 javascript 验证,则无法显示错误,但仍会在您输入无效数字或字符时阻止表单提交。
  • @Ranopano 是的,你是对的,请将此
    结束标记和 /Index 解决方案添加到您的答案中,以便我标记它。
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 2018-03-15
  • 2018-10-26
  • 1970-01-01
  • 2017-12-16
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多