asp.net core 2.0 не может опубликовать простую форму - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь выучить Asp.net Core 2.0 и, следуя руководству, я создал очень простую форму, содержащую только 1 свойство - имя Customer .Я отладил с помощью точек останова. Я даже не смог запустить метод PostAsync в CreateModel

CreateModel

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; }
}

Метод ConfigureServices в моем классе запуска

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

Обновление

Вот полный проект GitHub для воспроизведения проблемы: https://github.com/touseefbsb/aspnet_post

Когда я ввожу более 10 символов, он никогда не достигает точки останова в методе postasync, и на странице тоже ничего не происходит, он должен показывать мне ошибку проверки в пользовательском интерфейсено это не так.

Когда я ввожу имя длиной менее 10 символов и нажимаю «Отправить», он пытается выполнить отправку (достигается точка останова в postasync), но затем он пытается перенаправить, я получаю следующую страницу ошибки:

error stacktrace

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я только что клонировал ваше приложение, и оно работает нормально. Он сохраняет данные в InMemoryDatabase по мере необходимости. Вы можете увидеть результат в cmd cmd execution.

см. Другое фото для точки останова breakpoint photo

0 голосов
/ 14 сентября 2018

Убедитесь, что Razor сгенерировал для вас токен защиты от подделки.

Когда вы отправляете форму, этот токен должен быть проверен, и если ваши куки не имеют ожидаемого, отправка отклоняется.

Обновление:

Для метода RedirectToPage требуется полный путь к странице.

Передача формы предотвращается JavaScript, когда есть ошибка ввода, но она не будет отображаться, потому что <div asp-validation-summary="All"> не хватает закрывающего </div>.

...