编辑2
我已经完成了从表单提交到Web服务执行完成的代码执行,似乎超时向用户发送电子邮件,这可能意味着我的SMTP客户端详细信息。我会尝试谷歌,看看它是如何工作的。
结束编辑2
我正在编写一个Web应用程序,它将数据发送到我编写的Web服务,该服务将数据存储在数据库中。
不幸的是,无论POST是否成功,Web应用程序在提交数据后都不会执行任何操作。没有任何迹象表明由于提交而发生任何事情。
我在我的视图上通过ajax进行POST:
$("form").submit(function () {
$.post($(this).attr("action"), $(this).serialize(), function (data) {
if (!data.IsOK) {
DisplayError(data.Title, data.Message, data.Error);
}
else {
window.location.href = '@Url.Content("~/User")';
}
return;
});
return false;
});
My Controller按如下方式处理服务器的POST:
[HttpPost]
public async Task<ActionResult> Create(User source)
{
if (Request.Cookies["AdminCookie"] == null)
return RedirectToRoute("Home");
if (ModelState.IsValid)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49474/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsJsonAsync("api/user", source);
if (response.IsSuccessStatusCode)
{
return Json(new
{
Message = "Success",
IsOK = bool.TrueString
});
}
}
return View();
}
catch(Exception ex)
{
ReportError(ex, "CREATE");
}
}
return View();
}
编辑1
查看这段代码,我发现如果响应状态代码不是成功代码,我就没有做任何事情,但是,我也从经验中知道,如果这样,我不太可能从响应中获得更多有用的信息是这样的。至少不是基于我目前的代码......我怎样才能改进呢?
结束编辑
正如我们所看到的,一旦成功Json返回到View,它应该被重定向到同一路径上的“Index”视图,否则,如果出现错误,它应该显示错误模式我自己的设计告诉用户有什么问题。
public HttpResponseMessage Post([FromBody]User Source)
{
try
{
User u = new User();
u.EmailAddress = Source.EmailAddress;
u.FirstName = Source.FirstName;
u.LastName = Source.LastName;
u.Password = Hashing.CreatePassword(Source.Password);
u.RoleId = Source.RoleId;
u.Role = db.Roles.Single(x => x.Id == u.RoleId);
db.Users.Add(u);
db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (Exception ex)
{
return ReportError(ex, "POST USER");
}
}
private HttpResponseMessage ReportError(Exception ex, string Action = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(String.Format("Error actioning request: [ {0} ]", ex.Message));
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Error");
response.Content = new StringContent(ex.ToString(), Encoding.Unicode);
return response;
}
这是我第一次使用Web服务,因此我几乎按照我从一些教程和[似乎]常识中学到的东西进行操作。
我在这里误解了什么吗?我做错了什么?
答案 0 :(得分:0)
在此处设置断点:HttpResponseMessage response = await client.PostAsJsonAsync(&#34; api / user&#34;,source);并确保您收到回复。如果你不是那么你只是返回一个空视图和&#34;数据&#34;您的ajax不存在评估IsOk的情况。
[HttpPost]
public async Task<ActionResult> Create(User source)
{
if (Request.Cookies["AdminCookie"] == null)
return RedirectToRoute("Home");
if (ModelState.IsValid)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49474/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/user", source); //debug here to ensure you are getting a response
var serializer = new JavaScriptSerializer();
var dataObject = serializer.Deserialize<SomeResponse>(response);
if (dataObject.Success)
{
return Responder("Success", true);
}
}
return Responder();
}
catch(Exception ex)
{
ReportError(ex, "CREATE");
return Responder();
}
}
}
private object Responder(string message = "Did not succeed", bool succeeded = false)
{
return new
{
Message = message,
IsOK = succeeded
};
}
public IHttpActionResult Post([FromBody]User Source)
{
try
{
User u = new User();
u.EmailAddress = Source.EmailAddress;
u.FirstName = Source.FirstName;
u.LastName = Source.LastName;
u.Password = Hashing.CreatePassword(Source.Password);
u.RoleId = Source.RoleId;
u.Role = db.Roles.Single(x => x.Id == u.RoleId);
db.Users.Add(u);
db.SaveChanges();
return new SomeResponse().Success = true;
}
catch (Exception ex)
{
return ReportError(ex, "POST USER");
}
}
public class SomeResponse
{
public bool Success { get; set; }
}