私は次のコードを入手しました
function pushJsonData(productName) {
$.ajax({
url: "/knockout/SaveProduct",
type: "POST",
contentType: "application/json",
dataType: "json",
data: " { \"Name\" : \"AA\" } ",
async: false,
success: function () {
loadJsonData();
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus + " in pushJsonData: " + errorThrown + " " + jqXHR);
}
});
}
データ値をハードコードしていることに注意してください。データはデータベースに正常にプッシュされます。しかし、エラーが発生し続けます。
解析エラー 構文エラー 予期しない入力の終了
データが正しい JSON 構文であることは確かです。Chrome インスペクターのネットワークで確認したところ、saveProduct リクエストでデータが正しいことが示されました。
{ "Name": "AA" }
この POST リクエストには応答がありませんでした。そのため、解析エラーがどこから発生したのかわかりません。FireFox ブラウザを使用してみました。同じことが起こりました。
何が問題なのか、誰かわかるでしょうか?
ありがとう、
PS コントローラーのコードはこちら
namespace MvcApplJSON.Controllers
{
public class KnockoutController : Controller
{
//
// GET: /Knockout/
public ActionResult Index()
{
return View();
}
[HttpGet]
public JsonResult GetProductList()
{
var model = new List<Product>();
try
{
using (var db = new KOEntities())
{
var product = from p in db.Products orderby p.Name select p;
model = product.ToList();
}
}
catch (Exception ex)
{ throw ex; }
return Json(model, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public void SaveProduct (Product product)
{
using (var db = new KOEntities())
{
db.Products.Add(new Product { Name = product.Name, DateCreated = DateTime.Now });
db.SaveChanges();
}
}
}
}
ベストアンサー1
何が問題なのかはっきりとは言えません。文字が間違っているのかもしれませんし、先頭と末尾にスペースが残っているのかもしれません。わかりません。
いずれにせよ、JSON を文字列としてハードコードするべきではありません。代わりに、JSON データをサーバーに送信する適切な方法は、JSON シリアライザーを使用することです。
data: JSON.stringify({ name : "AA" }),
ここで、サーバー上で、この入力を受け取ることを想定した適切なビュー モデルがあることを確認します。
public class UserViewModel
{
public string Name { get; set; }
}
対応するアクション:
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
}
ここでもう 1 つあります。 を指定しましたdataType: 'json'
。これは、サーバーが JSON の結果を返すことを期待していることを意味します。コントローラー アクションは JSON を返す必要があります。コントローラー アクションがビューを返す場合、これがエラーの原因である可能性があります。これは、jQuery がサーバーからの応答を解析しようとするときです。
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
return Json(new { Foo = "bar" });
}
そうは言っても、ほとんどの場合、dataType
ASP.NET MVC コントローラー アクションに AJAX 要求を行うときに、プロパティを設定する必要はありません。その理由は、特定のものActionResult
( や などViewResult
)を返すとJsonResult
、フレームワークが自動的に正しいContent-Type
応答 HTTP ヘッダーを設定するためです。jQuery は、このヘッダーを使用して応答を解析し、解析済みの成功コールバックにパラメーターとして渡します。
ここで発生している問題は、サーバーが有効な JSON を返さなかったことにあると思われます。ViewResult または PartialViewResult が返されたか、コントローラー アクションで壊れた JSON を手動で作成しようとしました (明らかにこれはすべきではありませんが、代わりに JsonResult を使用してください)。
私が今気づいたもう一つのこと:
async: false,
この属性を false に設定しないでください。この属性を false に設定すると、false
リクエストの実行中ずっとクライアント ブラウザがフリーズします。この場合は、通常のリクエストを行うことができます。AJAX を使用する場合は、非同期イベントとコールバックについて考え始めてください。