首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax.BeginForm和验证

Ajax.BeginForm和验证
EN

Stack Overflow用户
提问于 2013-05-19 22:03:37
回答 2查看 24.2K关注 0票数 10

在Ajax.BeginForm中,客户端验证对我不起作用

这是我的代码:

代码语言:javascript
复制
<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页面中启用了验证:

代码语言:javascript
复制
<add key="ClientValidationEnabled" value="true" />   
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

,并添加了js文件。

代码语言:javascript
复制
<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>

与第一个问题相关的第二个问题,我的操作是

代码语言:javascript
复制
[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倍罗尼

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 15:13:07

我想通了..。您应该对结果和查询具有局部视图。

如果失败,您应该返回"http bad request“,并使用以下代码在搜索部分视图上设置验证。

它应该是这样的:

代码语言:javascript
复制
        @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>

在服务器上,它应该如下所示:

代码语言:javascript
复制
[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);
    }
票数 6
EN

Stack Overflow用户

发布于 2013-05-19 22:36:34

当您的模型状态无效,并且您返回包含错误的模型的视图时,服务器发送的响应的http状态为200,表示请求成功。在本例中,ajax表单执行您指示它做的事情,即将返回的响应插入分区repostContent中(您可以通过检查页面的第二次呈现是否在该div中完成来验证这一点)。至于如何让ajax提交表单在显示验证消息方面与普通表单提交一样,我还没有找到一个简单直接的方法(也许有人可以在这里为我们指出:)。我通过以下方式解决了这个问题:

  1. 将部分视图中的表单呈现到主视图的 div (formDiv) 中。
  2. 在 ajax 表单上指定“OnFailure”,将响应文本插入到包含原始表单 (formDiv) 的 div 中
  3. 覆盖 OnActionExecuted(因为我有一个主控制器,我的所有其他控制器都继承自它只在一个地方完成)以检查请求 IsAjax 和 ModelState 是否无效,我将响应状态更改为 4xx。这会导致“OnFailure”被触发,将原始表单替换为 If(!ModelState.Isvalid) 分支中返回的表单。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16635460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档