English 中文(简体)
TryUpdate ModelAsync 驳回无效航行财产?
原标题:TryUpdateModelAsync rejects null naviagation properties?

<编码> TryUpdate ModelAsync()似乎拒绝接受我的模型物体,如果航行财产无效,即使外国钥匙被适当确定。

例如,如果作者身份证明成立,它就获得接受书,但作者却无效:

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}

这里是一个完整的工作例子,表明这种行为问题:

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Book> Books { get; set; }
}

模式:

public class EditModel : PageModel
{
    private readonly YourDbContext _context;
    private readonly ILogger<EditModel> _logger;

    [BindProperty] public Book Book { get; set; }
    public List<Author> Authors {get; set;}

    public EditModel(YourDbContext context, ILogger<EditModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public async Task<IActionResult> OnGetAsync(int? id)
    {
        if (id == null) { return NotFound(); }

        Book = await _context.Books.Include(b => b.Author).FirstOrDefaultAsync(m => m.Id == id);
        if (Book == null) { return NotFound(); }

        Authors = await _context.Authors.ToListAsync();
        return Page();
    }

    public async Task<IActionResult> OnPostAsync(int? id)
    {
        var bookToUpdate = await _context.Books.FindAsync(id);
        if (bookToUpdate == null) { return NotFound(); }

        if (await TryUpdateModelAsync<Book>(bookToUpdate, "book", b => b.Title, b => b.AuthorId))
        {
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
        else 
        {
            foreach (var modelStateKey in ModelState.Keys)
            {
                var modelStateVal = ModelState[modelStateKey];
                foreach (var error in modelStateVal.Errors)
                {
                    _logger.LogError($"Key: {modelStateKey}, Error: {error.ErrorMessage}");
                }
            }
        }
        Book = bookToUpdate;
        return RedirectToPage(new { id});
    }
}

Razor page:

@page
@model EditModel

<form method="post">
    <input type="hidden" asp-for="Book.Id" />
    <input asp-for="Book.Title" />
    <select asp-for="Book.AuthorId" asp-items="@(new SelectList(Model.Authors,"Id","Name"))"></select>
    <input type="submit" value="Save" />
</form>

模型国家总是有错误投诉:

Key: Book.Author, Error: The Author field is required.

这显然是一个简化的例子,但总体而言,可以有许多大型导航特性,因此,所有这些特性都不可能有人居住。

问题回答




相关问题
Entity Framework with MySQL connector in c#

I have been trying to get the Entity Framework to work in my web application using MySQL. It works fine on my local pc, but doesn t work when I put it on the server. Since the server is a shared ...

How Do I Create And Update A Many To Many Relationship With EF

I am using the Entity Framework with SQL Server. I have a many to many relationship between 2 tables. I have created a join table with just the primary key fields of the 2 tables. In the designer, the ...

Entity Framework with File-Based Database

I am in the process of developing a desktop application that needs a database. The application is currently targeted to SQL Express 2005 and works wonderfully. However, I m not crazy about having ...

Linq to enties, insert foreign keys

I am using the ADO entity framework for the first time and am not sure of the best way of inserting db recored that contain foreign keys. this is the code that i am using, I would appreciate any ...

Entity Framework - Many to many question

I have a table called ASB and a table called PeopleInvolved. There is a junction table called PeopleInvolved_ASB which simply contains an ASBID and a PeopleInvolvedID column. The columns act as a ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

ADO.NET Entity Data Model are not precise enough

I run this code: var cos = from k in _db.klienci_do_trasy where k.klient_id == 5 select k; but the query send to database is: SELECT * FROM `klienci_do_trasy` LIMIT 0, 30 why is it for, there ...

热门标签