.NET MVC - JQuery AJAX 有时检索局部视图 returns 404 错误,无法查明这背后的问题
.NET MVC - JQuery AJAX that retrieves a Partial View sometimes returns a 404 error, can't pinpoint issue behind this
我创建了一个表单,它通过单击按钮动态添加由表单字段组成的部分视图(每个部分视图都有唯一的按钮 - 一个用于记录请求,另一个用于参考请求) .用户可以在原始表单中添加任意数量的记录或参考请求。
从部分视图中检索 HTML 是通过 JQuery 的 Ajax 完成的。但是,它不能始终如一地工作。有时,如果我打开表单,在单击两个按钮之一时,会 return 出现 404 错误。但是,如果我刷新(或在其他时间打开),它会触发并发布结果 w/o 任何问题 - 当服务器能够 return 数据时它工作得很好。但当然,我需要它始终如一地工作,无法弄清楚这里发生了什么。
我已经尝试调整 ajax 设置 - 将类型从 GET 更改为 POST 并尝试通过 @Html.UrlAction 帮助程序找到部分视图所在的路径,但是无济于事。我用谷歌搜索了这个,但没有看到任何处理断断续续 AJAX 失败的事情:部分视图
HTML 为原始形式,为简洁起见,View/Home/Index.cshtml
<div class="customer">
<form>
<div class="form-row">
<div class="form-group col-md-6">
@Html.LabelFor(x => x.FirstName, new { @class = "required" })
@Html.TextBoxFor(x => x.FirstName, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.FirstName, "", new { @class = "text-danger" })
</div>
<div class="form-group col-md-6">
@Html.LabelFor(x => x.LastName, new { @class = "required" })
@Html.TextBoxFor(x => x.LastName, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.LastName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
@Html.LabelFor(x => x.Email, new { @class = "required" })
@Html.TextBoxFor(x => x.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.Email, "", new { @class = "text-danger" })
</div>
<div class="form-group col-md-6">
@Html.LabelFor(x => x.PhNbr, new { @class = "required" })
@Html.TextBoxFor(x => x.PhNbr, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.PhNbr, "", new { @class = "text-danger" })
</div>
</div>
</form>
</div>
<div class="request">
<h2 class="topspacing-med btmspacing-med">Request Details</h2>
<button type="button" class="btn btn-outline-secondary btn-lg btn-block btmspacing-med" id="addRecord">Add New Record Request</button>
<button type="button" class="btn btn-outline-secondary btn-lg btn-block" id="addRef">Add New Reference Request</button>
<div id="displayForm"></div>
</div>
</div>
示例局部视图 - View/Partials/_RecordRequestForm.cshtml
@Html.BeginForm("SubmitRecord", "Home"){
<div id="record">
<div class="card">
<div class="card-body">
<h3>Record Request</h3>
<div class="form-group">
@Html.LabelFor(x => x.Comments)
@Html.TextAreaFor(x => x.Comments, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.Comments, "", new { @class = "text-danger" })
</div>
</div>
<div class="btn-toolbar justify-content-between" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn-group float-right mt-2" role="group" aria-label="Second group" ">
<button type="button" class="btn btn-secondary btn-lg btn-block" id="cancel">Cancel</button>
<input class="btn btn-primary btn-lg btn-block" type="submit" value="Save" />
</div>
</div>
</div>
}
AJAX 脚本 - 在索引文件中
$("#addRecord").click(function () {
$.ajax({
//url: "../Views/Partials/_RecordRequestForm.cshtml",
url:"RenderNewRecordRequestForm",
dataType: "html",
type: 'GET',
success: function (result) {
$('#displayForm').append(result);
hideButtons();
count++;
console.log(count);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
},
});
});
在 Home 控制器中渲染部分的动作方法
private string PartialViewPath(string name)
{
return $"~/Views/Partials/Home/{name}.cshtml";
}
public ActionResult RenderNewRecordRequestForm()
{
return PartialView(PartialViewPath("_RecordRequestForm"));
}
_Layout 文件底部有 Jquery 引用
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
同样,这在 AJAX return 数据时效果很好,但它不能始终如一地工作。需要了解为什么它有时会失败。
好吧,这毕竟有效 - 使用:url: '@Url.Action("RenderNewRecordRequestForm", "Home")',在 Ajax设置。我以为我以前尝试过这个(或者可能在最后一次尝试中有错字)但现在 Ajax 能够通过正确的控制器中的正确的操作方法找到文件。一切都很好(到目前为止)。 –
我创建了一个表单,它通过单击按钮动态添加由表单字段组成的部分视图(每个部分视图都有唯一的按钮 - 一个用于记录请求,另一个用于参考请求) .用户可以在原始表单中添加任意数量的记录或参考请求。
从部分视图中检索 HTML 是通过 JQuery 的 Ajax 完成的。但是,它不能始终如一地工作。有时,如果我打开表单,在单击两个按钮之一时,会 return 出现 404 错误。但是,如果我刷新(或在其他时间打开),它会触发并发布结果 w/o 任何问题 - 当服务器能够 return 数据时它工作得很好。但当然,我需要它始终如一地工作,无法弄清楚这里发生了什么。
我已经尝试调整 ajax 设置 - 将类型从 GET 更改为 POST 并尝试通过 @Html.UrlAction 帮助程序找到部分视图所在的路径,但是无济于事。我用谷歌搜索了这个,但没有看到任何处理断断续续 AJAX 失败的事情:部分视图
HTML 为原始形式,为简洁起见,View/Home/Index.cshtml
<div class="customer">
<form>
<div class="form-row">
<div class="form-group col-md-6">
@Html.LabelFor(x => x.FirstName, new { @class = "required" })
@Html.TextBoxFor(x => x.FirstName, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.FirstName, "", new { @class = "text-danger" })
</div>
<div class="form-group col-md-6">
@Html.LabelFor(x => x.LastName, new { @class = "required" })
@Html.TextBoxFor(x => x.LastName, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.LastName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
@Html.LabelFor(x => x.Email, new { @class = "required" })
@Html.TextBoxFor(x => x.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.Email, "", new { @class = "text-danger" })
</div>
<div class="form-group col-md-6">
@Html.LabelFor(x => x.PhNbr, new { @class = "required" })
@Html.TextBoxFor(x => x.PhNbr, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.PhNbr, "", new { @class = "text-danger" })
</div>
</div>
</form>
</div>
<div class="request">
<h2 class="topspacing-med btmspacing-med">Request Details</h2>
<button type="button" class="btn btn-outline-secondary btn-lg btn-block btmspacing-med" id="addRecord">Add New Record Request</button>
<button type="button" class="btn btn-outline-secondary btn-lg btn-block" id="addRef">Add New Reference Request</button>
<div id="displayForm"></div>
</div>
</div>
示例局部视图 - View/Partials/_RecordRequestForm.cshtml
@Html.BeginForm("SubmitRecord", "Home"){
<div id="record">
<div class="card">
<div class="card-body">
<h3>Record Request</h3>
<div class="form-group">
@Html.LabelFor(x => x.Comments)
@Html.TextAreaFor(x => x.Comments, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.Comments, "", new { @class = "text-danger" })
</div>
</div>
<div class="btn-toolbar justify-content-between" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn-group float-right mt-2" role="group" aria-label="Second group" ">
<button type="button" class="btn btn-secondary btn-lg btn-block" id="cancel">Cancel</button>
<input class="btn btn-primary btn-lg btn-block" type="submit" value="Save" />
</div>
</div>
</div>
}
AJAX 脚本 - 在索引文件中
$("#addRecord").click(function () {
$.ajax({
//url: "../Views/Partials/_RecordRequestForm.cshtml",
url:"RenderNewRecordRequestForm",
dataType: "html",
type: 'GET',
success: function (result) {
$('#displayForm').append(result);
hideButtons();
count++;
console.log(count);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
},
});
});
在 Home 控制器中渲染部分的动作方法
private string PartialViewPath(string name)
{
return $"~/Views/Partials/Home/{name}.cshtml";
}
public ActionResult RenderNewRecordRequestForm()
{
return PartialView(PartialViewPath("_RecordRequestForm"));
}
_Layout 文件底部有 Jquery 引用
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
同样,这在 AJAX return 数据时效果很好,但它不能始终如一地工作。需要了解为什么它有时会失败。
好吧,这毕竟有效 - 使用:url: '@Url.Action("RenderNewRecordRequestForm", "Home")',在 Ajax设置。我以为我以前尝试过这个(或者可能在最后一次尝试中有错字)但现在 Ajax 能够通过正确的控制器中的正确的操作方法找到文件。一切都很好(到目前为止)。 –