Moortiii icon

Controller Eksempel

Moortiii | PRO | 02/24/19 11:01:31 AM UTC | 0 ⭐ | 278 👁️ | Never ⏰ | []
C# |

1.43 KB

|

None

|

0 👍

/

0 👎

Kan hende du kom over noe lignende i fjor.
 
Gitt at du har en klasse som refererer til en annen klasse, eksempelvis slik:
 
public class BlogPost
{
    public int BlogPostID { get; set; }
    public string Title { get, set; }
    public string Content { get; set; }
 
    // Her henviser en BlogPost til en annen klasse
    public ApplicationUser Author { get; set; }
}
 
Dersom man skal ha en Edit action i kontroller gjør man noe lignende:
 
Antar at vi har en:
 
private readonly ApplicationDbContext _context;
 
public async Task<IActionResult> Edit(int id, [Bind("BlogPostID, Title, Content") BlogPost post)
{
    // Forfatteren lastes ikke inn automatisk så vi kan gjøre:
    var author = _context.BlogPosts
        .Include(blogPost => blogPost.Author
        .AsNoTracking()
        .FirstOrDefaultAsync(entry => entry.BlogPostId == id)
        .Result
        .Author;
    
    // .NET Lar oss ikke hente ut forfatter uten å spesifisere AsNoTracking, siden begge postene har samme Primary Key
    // Derfor må vi merke den som AsNoTracking(). Er det noen måte å slippe å gjøre dette på, altså at argumentet til
    // funksjonen automatisk laster inn relaterte data på egenhånd?
 
    // Det gjør det forvirrende hvis man skal abstracte til en service klasse og må ha to funksjoner som gjør det samme:
    
    _blogPostService.LoadBlogPostAsync(id);
    _blogPostService.LoadBlogPostAsNonTrackingAsync(id);
 
    if(author.Id != User.Id)
    {
        // Prevent user from editing blog post
    }
}

Comments