2016-08-22 4 views
0

Ich habe eine Save-Methode in meinem SavesController (Web-API-Controller). Als ich es mit dem Postboten getestet habe, kam es zurück.Warum der Postbote eine "Nicht-statische Methode erfordert ein Ziel" zurückgibt.

{ 
"message": "An error has occurred.", 
"exceptionMessage": "Non-static method requires a target.", 
"exceptionType": "System.Reflection.TargetException", 
"stackTrace": " at System.Web.Http.ApiController. <InvokeActionWithExceptionFilters>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()" 
    } 

Meine sichere Methode ist dies. Ausnahme wurde ausgelöst, wenn Anweisung

[HttpPost] 
public IHttpActionResult Save(SavesDto dto) 
{ 
    var userId = User.Identity.GetUserId(); 

    if (_context.SavedPosts.Any(a => a.AttendeeId == userId && a.PostId == dto.PostId)) 
    return BadRequest("The save already exists."); 

    var savedPost = new Saves 
    { 
     PostId = dto.PostId, 
     AttendeeId = userId 
    }; 
    _context.SavedPosts.Add(savedPost); 
    _context.SaveChanges(); 

    return Ok(); 
} 

ich gesucht habe durch die internet.I herausgefunden, dass Problem kommt von der einen Nullwert in der Verwendung von LINQ. Aber jede Methode in Linq-Anweisung gibt nur wahr/falsch zurück, warum wirft es diese Ausnahme?

public class SavesDto 
{ 
    public int PostId { get; set; } 
} 

Ich rief die Api hier

@foreach(var post in Model) 
{ 
<button 
data-post-id="@post.Id" 
class="btn btn-default btn-sm pull-right .js-toggle-save">Save ?</button 
} 

@section scripts 
{ 
    <script> 
$(document).ready(function() 
{ 
    $(".js-toggle-save").click(function(e) 
    { 
     var button = $(e.target); 
     $.post("/api/saves", { postId: button.attr("data-post-id") }) 
     .done(function() 
     { 
      button.removeClass("btn-default") 
      .addClass("btn-info").text("Saved"); 
     }) 
     .fail(function() 
     { 
      alert("something failed"); 
     }) 
    }); 
} 
); 
</script> 
} 

postID und AttendeeId keine Nullwerte enthalten sind

public class Saves 
{ 
    public ApplicationUser User { get; set; } 
    public Post Post { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public int PostId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public string AttendeeId { get; set; } 

} 

Antwort

0

Diese Ausnahme tritt auf, wenn Sie eine Variable in einem Lambda-Ausdruck verwenden, die null ist. Es scheint, dass das DTO-Objekt Null ist. Versuchen Sie also Folgendes:

if (dto != null && _context.SavedPosts.Any(a => a.AttendeeId == userId 
    && a.PostId == dto.PostId)) 
+0

Ja dto Objekt war null. Nun wird die Null-Referenz-Ausnahme auf die nächste Zeile geworfen. Irgendeine Idee, warum Dto-Objekt null ist, weil ich postId im Skript übergebe und danke. – savvy

+0

Die Methode im Controller erstellt keine Instanz des dto-Objekts, um sie dann mit dem PostId-Wert zu füllen. Wenn Sie akzeptiert haben: int PostID anstelle des dto-Objekts, dann erwarte ich, dass es funktioniert. – Rono

Verwandte Themen