2016-08-22 2 views
0

У меня есть метод Save в моем SavesController (контроллер Web Api). Когда я протестировал его с почтальоном, он вернул это.Почему почтальон возвращает «Нестатический метод требует цели».

{ 
"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()" 
    } 

My save способ это. Исключение было брошено, если заявление

[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(); 
} 

Я искал через internet.I выяснил, что проблема исходит от использования нулевого значения в пределах LINQ. Но любой метод в выражении Linq возвращает true/false, почему он выбрасывает это исключение?

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

Я назвал Api здесь

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

и AttendeeId сообщения дан не обнуляемым

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

} 

ответ

0

Это исключение возникает при использовании переменной в лямбда-выражение, которое является нулевым. По-видимому, объект dto имеет значение null. Поэтому попробуйте сделать это:

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

Да, объект dto был null. Теперь исключение ссылки Null бросается на следующую строку. Любая идея, почему dto object имеет значение null, потому что я передаю postId в скрипте и спасибо. – savvy

+0

Метод в контроллере не создает экземпляр объекта dto, а затем заполняет его значением PostId. Если вы приняли: int PostID, вместо объекта dto, то я ожидаю, что это сработает. – Rono