首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不引人注目的Ajax需要一个布局页面(返回部分视图不起作用)?

为什么不引人注目的Ajax需要一个布局页面(返回部分视图不起作用)?
EN

Stack Overflow用户
提问于 2014-06-18 14:10:50
回答 1查看 560关注 0票数 0

在创建自定义插件时,Ajax会对尚未被未公开的Ajax进行Ajax处理的任何form进行Ajax处理,但我注意到,我的部分/布局代码未能在回发时以普通的、不显眼的Ajax形式显示:

对于我的其他部分更新插件,我有条件地将页面呈现为分部(对于ajax请求)或填充布局(对于普通请求),如下所示:

代码语言:javascript
运行
复制
    public ActionResult AjaxForm()
    {
        if (!Request.IsAjaxRequest())
        {
            ViewBag.Layout = "_Layout.cshtml";
        }
        return PartialView();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AjaxForm(AjaxFormModel model)
    {
        if (!Request.IsAjaxRequest())
        {
            ViewBag.Layout = "_Layout.cshtml";
        }

        if (ModelState.IsValid)
        {
            return PartialView("Success", model);
        }

        return PartialView(model);
    }

当测试一个普通的、不引人注目的Ajax表单时,我使用了这个测试视图,它只更新了它自己的元素UpdateTargetId="FormPanel"

代码语言:javascript
运行
复制
@using (Ajax.BeginForm("AjaxForm", null, new AjaxOptions() { UpdateTargetId = "FormPanel" }, new { id = "FormPanel" }))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.AddressLine, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.AddressLine, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

如果我移除测试if (!Request.IsAjaxRequest()),并返回带有母版页/布局的完整页面,它就会将结果呈现在表单所在的位置。

Fiddler显示在两种情况下都会返回"success“视图,但是如果没有布局,它不会做任何事情。

Q.为了提取内容并替换指定的元素,在一个不引人注目的Ajax主页/布局中需要什么?

更新:

更糟糕的是,它实际上在第一次正确工作,但如果我再次加载相同的表单,则不会。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-18 14:37:12

表单必须有唯一的ID!

在SO上存在大量关于唯一id的问题,浏览器通常会处理这些问题,但是您永远无法打破的问题是有两个表单加载相同的id。只有一个对JavaScript/jQuery!可见

我的问题是由重复的表单ID引起的。您不应该将结果页插入表单本身(保持表单元素完整)。

当我在幻灯片样式的控件中动态地重新加载原始表单时,我最终得到了重复的表单ID。

这意味着低调的Ajax只能看到DOM中的第一种形式!

解决方案(不要设置Ajax表单来更新自己):

UpdateTargetId设置为窗体上方的元素,如果动态加载面板,则不要设置表单本身。

修正我的示例视图(用目标面板环绕表单):

代码语言:javascript
运行
复制
<div id="FormPanel">
    @using (Ajax.BeginForm("AjaxForm", new AjaxOptions() { UpdateTargetId = "FormPanel" }))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24287849

复制
相关文章

相似问题

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