在Ajax.BeginForm中,客户端验证对我不起作用
这是我的代码:
<div id="report">
<div id="projectReport">
<div >
@{
Html.EnableClientValidation();
}
@using (Ajax.BeginForm("AnalyticsDates", new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "reportContent"
}))
{
@Html.LabelFor(m => m.StartDate)
@Html.TextBoxFor(m => m.StartDate, new { id = "start" })
@Html.ValidationMessageFor(model => model.StartDate)
@Html.LabelFor(m => m.EndDate)
@Html.TextBoxFor(m => m.EndDate, new { id = "end" })
@Html.ValidationMessageFor(model => model.EndDate)
<input id="btnsearch" type="submit" value=@Titles.Search class="iconHeader"/>
}
</div>
</div>
<div id="reportContent">
</div>
</div>并且我在web.config页面中启用了验证:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />,并添加了js文件。
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>与第一个问题相关的第二个问题,我的操作是
[HttpPost]
[Authorize(Roles = "XXXReport")]
public async Task<ActionResult> AnalyticsDates(ReportRequestVM reportRequestVM)
{
if (!ModelState.IsValid)
{
return View("**MainReports**", reportRequestVM);
}
// fill reportRequestVM with data
return View("**PartialReport**", reportRequestVM);
}如果模型有效,我会返回一个局部视图,页面看起来很好,否则我会返回主视图和表单,但在这种情况下,页面会自我呈现两次。问题是,如果客户端验证失败,如何返回带有验证错误的主窗体?
任何帮助都将不胜感激,10倍罗尼
发布于 2013-05-22 15:13:07
我想通了..。您应该对结果和查询具有局部视图。
如果失败,您应该返回"http bad request“,并使用以下代码在搜索部分视图上设置验证。
它应该是这样的:
@using (Ajax.BeginForm("CloudAnalyticsDates", new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "reportContent",
OnFailure = "OnCloudAnalyticsFailure",
OnBegin = "ValidateForm",
}))
{
@Html.LabelFor(m => m.StartDate)
@Html.TextBoxFor(m => m.StartDate, new { id = "start" })
@Html.ValidationMessageFor(model => model.StartDate)
@Html.LabelFor(m => m.EndDate)
@Html.TextBoxFor(m => m.EndDate, new { id = "end" })
@Html.ValidationMessageFor(model => model.EndDate)
<input id="btnsearch" type="submit" value=@Titles.Search class="iconHeader"/>
}
</div>
</div>
<script type="text/javascript">
$(document).ready(function () {
$("#datePicker").kendoDatePicker();
$("#start").kendoDatePicker().data("kendoDatePicker");
$("#end").kendoDatePicker().data("kendoDatePicker");
});
function OnCloudAnalyticsFailure(parameters) {
$('#projectReport').html(parameters.responseText);
$('#reportContent').empty();
CleanValidationError('form');
}
</script>在服务器上,它应该如下所示:
[HttpPost]
public async Task<ActionResult> CloudAnalyticsDates(ReportRequestVM reportRequestVM)
{
if (!ModelState.IsValid)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return PartialView("_ReportQuery", reportRequestVM);
}
reportRequestVM.BomTotals = await CommonRequestsHelper.GetBomTotalAnalytics(bomTotalRequest);
return PartialView("_ProjectReport", reportRequestVM);
}发布于 2013-05-19 22:36:34
当您的模型状态无效,并且您返回包含错误的模型的视图时,服务器发送的响应的http状态为200,表示请求成功。在本例中,ajax表单执行您指示它做的事情,即将返回的响应插入分区repostContent中(您可以通过检查页面的第二次呈现是否在该div中完成来验证这一点)。至于如何让ajax提交表单在显示验证消息方面与普通表单提交一样,我还没有找到一个简单直接的方法(也许有人可以在这里为我们指出:)。我通过以下方式解决了这个问题:
https://stackoverflow.com/questions/16635460
复制相似问题