Как привязать интерфейс к форме Razor - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть форма Razor (из скаффолдинга), привязка к интерфейсу:

public class CreateModel : PageModel
{
    private readonly ImageStorm.DB.Core.ImagestormContext _context;

    public CreateModel(ImageStorm.DB.Core.ImagestormContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        return Page();
    }

    [BindProperty]
    public IImaging Imaging { get; set; } = new Imaging();

    // To protect from overposting attacks, please enable the specific properties you want to bind to, for
    // more details see https://aka.ms/RazorPagesCRUD.
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.Imagings.Add((Imaging)Imaging);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

Я создал интерфейс для класса EF.Core, чтобы я мог помещать туда атрибуты и не беспокоиться о потеря их всех при обновлении модели.

    public interface IImaging
    {
        string Cron { get; set; }
        [DataType(DataType.DateTime)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MMM-dd HH: mm}")]
        DateTime? CronEnd { get; set; }
        [DataType(DataType.DateTime)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MMM-dd HH: mm}")]
...

Это прекрасно работает для страницы индекса Scafolded.

Однако, когда я использую этот подход для страницы создания, я получаю следующую ошибку при сохранении :

InvalidOperationException: Не удалось создать экземпляр типа 'ImageStorm.DB.Core.IImaging'. Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров. Или же установите для свойства 'Imaging' ненулевое значение в конструкторе 'ImageStorm.Client.CreateModel'.

Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext bindingContext)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.BindModelCoreAsync(ModelBindingContext bindingContext, int propertyData)
Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, object value)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageBinderFactory+<>c__DisplayClass2_0+<<CreatePropertyBinder>g__Bind|0>d.MoveNext()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.BindArgumentsCoreAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Есть ли обходной путь или лучший подход?

1 Ответ

0 голосов
/ 09 февраля 2020

Как связать интерфейс с формой Razor

Вы этого не сделаете.

Сообщение об ошибке сбрасывается

Сложные типы, связанные с моделью не должны быть абстрактными или значениями и должны иметь конструктор без параметров . `.

упорная шахта

Используйте конкретную реализацию.

public class CreateModel : PageModel {
    private readonly ImageStorm.DB.Core.ImagestormContext _context;

    public CreateModel(ImageStorm.DB.Core.ImagestormContext context) {
        _context = context;
    }

    public IActionResult OnGet() {
        return Page();
    }

    [BindProperty]
    public Imaging Imaging { get; set; } = new Imaging();//<-- NOTE USE OF IMPLEMENTATION 

    public async Task<IActionResult> OnPostAsync() {
        if (!ModelState.IsValid) {
            return Page();
        }

        _context.Imagings.Add(Imaging);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

Ссылка Связывание модели в ASP. NET Core

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...