我试图在ASP.NET Core MVC中使用AJAX进行内联编辑。每次我都收到错误400(Bad Request)
我需要点击表中的行来编辑和保存在SQL数据库中的新值。
我做的是对的还是错的?请澄清是否有更好的方法
我的Index.cshtml
:
@model IEnumerable<officeprotocol.Areas.UpdatedThankReq.Models.MainTexts>
<table class="table" id="tstTable">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.BeginText)
</th>
<th>
@Html.DisplayNameFor(model => model.EndText)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td class="maintxtId">
<span id="idVal">@item.Id</span>
</td>
<td class="maintxtBegin">
<span>@item.BeginText</span>
<input id="bgnTxtIn" type="text" value="@item.BeginText" style="display:none"/>
</td>
<td class="maintxtEnd">
<span>@item.EndText</span>
<input id="endTxtIn" type="text" value="@item.EndText" style="display:none" />
</td>
<td>
<a class="Edit" href="javascript:;">Edit</a>
<a class="Update" href="javascript:;" style="display:none">Update</a>
<a class="Cancel" href="javascript:;" style="display:none">Cancel</a>
<a class="Delete" href="javascript:;">Delete</a>
</td>
</tr>
}
</tbody>
</table>
@section scripts
{
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("body").on("click", '#tstTable .Edit', function () {
var row = $(this).closest("tr");
$("td", row).each(function () {
if ($(this).find("input").length > 0) {
$(this).find("input").show();
$(this).find("span").hide();
}
});
row.find(".Update").show();
row.find(".Cancel").show();
row.find(".Delete").hide();
$(this).hide();
});
$("body").on("click", '#tstTable .Update', function () {
var row = $(this).closest("tr");
$("td", row).each(function () {
if ($(this).find("input").length > 0) {
var span = $(this).find("span");
var input = $(this).find("input");
span.html(input.val());
span.show();
input.hide();
}
});
row.find(".Edit").show();
row.find(".Delete").show();
row.find(".Cancel").hide();
$(this).hide();
var MaintxtViewModel = {
Id: parseInt($("#idVal").html()),
BeginText: $("#bgnTxtIn").val(),
EndText: $("#endTxtIn").val()
// Id: parseInt(row.find(".maintxtId").find("span").html()),
// BeginText: row.find(".maintxtBegin").find("span").html(),
// EndText: row.find(".maintxtEnd").find("span").html()
};
$.ajax ({
type: 'POST',
url: "/ReqArea/MainTexts/Edit",
data: { mainTexts: MaintxtViewModel },
success: function (result) {
alert("Saved");
},
failure: function (result) {
alert("Failed")
},
error: function (result) {
alert("SaveError");
}
});
});
});
</script>
}
字符串
我的区域控制器
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.MainTexts == null)
{
return NotFound();
}
var mainTexts = await _context.MainTexts.FindAsync(id);
if (mainTexts == null)
{
return NotFound();
}
return View(mainTexts);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,BeginText,EndText")] MainTexts mainTexts)
{
if (id != mainTexts.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(mainTexts);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MainTextsExists(mainTexts.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(mainTexts);
}
型
的数据
我试过很多次想解决这个问题。
现在我需要的就是
1条答案
按热度按时间vptzau2j1#
删除
[ValidateAntiForgeryToken]
属性将解决您当前的问题。下面还有一些其他问题:
1.记住在路由中传递id:
字符串
2.你用来获取输入值的代码总是会得到第一个
tr
,你需要修改你的js代码:型
3.
value
属性始终是原始值,添加js代码:型
整个js代码
型