Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery WebAPI Put返回HTTPResponseMessage null_Jquery_Asp.net Mvc 3_Asp.net Mvc 4_Asp.net Web Api_Asp.net Mvc 5 - Fatal编程技术网

Jquery WebAPI Put返回HTTPResponseMessage null

Jquery WebAPI Put返回HTTPResponseMessage null,jquery,asp.net-mvc-3,asp.net-mvc-4,asp.net-web-api,asp.net-mvc-5,Jquery,Asp.net Mvc 3,Asp.net Mvc 4,Asp.net Web Api,Asp.net Mvc 5,我需要实现简单的编辑功能。我正在使用webapi服务更新我的测试对象。 我正在从控制器post请求调用以下方法 这是在测试调用中调用metod的控制器,inturn调用put服务 public ActionResult TestEdit(Test test) { if (ModelState.IsValid) { // objTest is returned null HttpResponseMessage objtest = TestDatabaseService.Te

我需要实现简单的编辑功能。我正在使用webapi服务更新我的测试对象。 我正在从控制器post请求调用以下方法

这是在测试调用中调用metod的控制器,inturn调用put服务

public ActionResult TestEdit(Test test)
{
  if (ModelState.IsValid)
  {
    // objTest is returned null
    HttpResponseMessage objtest = TestDatabaseService.TestEdit(test.testID, test);
  }
}

// Method which calls put service testDataService
public HttpResponseMessage TestEdit(int id, Test test)**
{
   string uri = baseUri + "Test/" + id;
   using (HttpClient httpClient = new HttpClient())
   {
      Task<HttpResponseMessage> response = httpClient.PutAsJsonAsync<Test>(uri, application);
            return response.Result;
   }
}

// The webapi service put method 
public HttpResponseMessage PutTest(int id, Test test)
{
  if (ModelState.IsValid && id == test).testID)
  {
    db.Entry(test)).State = EntityState.Modified;

    try
    {
      db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
      return Request.CreateResponse(HttpStatusCode.NotFound); 
    }

    // The status code is set to indicate the save is success
    return Request.CreateResponse(HttpStatusCode.OK); 
  }
  else
  {
    // If save failed
    return Request.CreateResponse(HttpStatusCode.BadRequest); 
  }
}
public ActionResult TestEdit(测试)
{
if(ModelState.IsValid)
{
//objTest返回空值
httpresponsemessageobjtest=TestDatabaseService.TestEdit(test.testID,test);
}
}
//调用put服务testDataService的方法
公共httpresponsemessagetestedit(int-id,Test-Test)**
{
字符串uri=baseUri+“Test/”+id;
使用(HttpClient HttpClient=new HttpClient())
{
任务响应=httpClient.PutAsJsonAsync(uri,应用程序);
返回响应。结果;
}
}
//webapi服务put方法
公共HttpResponseMessagePuttest(int-id,Test-Test)
{
if(ModelState.IsValid&&id==test.testID)
{
db.Entry(test)).State=EntityState.Modified;
尝试
{
db.SaveChanges();
}
catch(DbUpdateConcurrencyException)
{
返回请求.CreateResponse(HttpStatusCode.NotFound);
}
//状态代码设置为指示保存成功
返回Request.CreateResponse(HttpStatusCode.OK);
}
其他的
{
//如果保存失败
返回请求.CreateResponse(HttpStatusCode.BadRequest);
}
}
。 公共应用程序TestCreate(测试) {string uri=baseUri+“Test”; 使用(HttpClient HttpClient=new HttpClient()) {Task response=httpClient.PostAsJsonAsync(uri,test); 返回JsonConvert.DeserializeObjectAsync(response.Result.Content.ReadAsString)‌​nc().Result)。结果; } }这毫无意义:

JsonConvert.DeserializeObjectAsync<HttpResponseMessage>(response.Result.Content.ReadAsStringAsync().Result).Result
没有什么可以反序列化的。你所要做的就是等待它的结果。首先,使您的方法
异步

public async Task<HttpResponseMessage> TestEdit(int id, Test test)
等待您的其他方法:

HttpResponseMessage objtest = await TestDatabaseService.TestEdit(test.testID, test);
现在还不清楚为什么需要在多个方法后面抽象它,但是如果语义对您的需要有意义,那就好了。没有直接的伤害


但基本上,您试图告诉一个JSON反序列化程序反序列化某个对象,它不是该对象的JSON表示。因此结果将是
null
,因为反序列化将悄悄失败。但关键是,这里不需要反序列化任何内容
PutAsJsonAsync
已经返回了类型为
HttpResponseMessage

的对象。有人能解释一下这个问题的可能副本吗?你能理解我面临的问题吗?谢谢大卫,谢谢你给我指明了正确的道路。我用的是VS2010。net框架4.0。我无法添加async并等待。这不是识别。我认为这是4.5的一部分?@jubi:在这种情况下,您似乎必须使用较旧的方法来处理异步操作(我并不完全熟悉),或者使用这些操作的同步版本。您可以直接调用任务上的
.Result
,也可以调用
.Wait()
。无论您如何处理异步操作,要点都保持不变。从方法返回对象时不需要反序列化。您救了我。我做了如下修改:Task response=httpClient.PutAsJsonAsync(uri,应用程序);返回响应。结果;它成功了。非常感谢大家对创建我的代码是否为公共应用程序TestCreate(Test Test){string uri=baseUri+“Test”;使用(HttpClient-HttpClient=new-HttpClient()){Task response=HttpClient.postsjsonasync(uri,Test);返回JsonConvert.DeserializeObjectAsync(response.Result.Content.ReadAsStringAsync().Result).Result;}}}公共列表TestIndex(){字符串uri=baseUri+“Test/”,使用(HttpClient HttpClient=new HttpClient()){Task response=httpClient.GetStringAsync(uri);返回JsonConvert.DeserializeObjectAsync(response.Result).Result;}}这为我提供了添加的所有测试的列表视图。这是一种摘要。在“创建和列表”中,我进行了反序列化。我需要序列化它吗?是否正确?
return await httpClient.PutAsJsonAsync<Test>(uri, test);
public async Task<ActionResult> TestEdit(Test test)
HttpResponseMessage objtest = await TestDatabaseService.TestEdit(test.testID, test);