【问题标题】:Ajax.BeginForm posts to surface controller and updates target id with full page instead of partial viewAjax.BeginForm 发布到表面控制器并使用整页而不是部分视图更新目标 ID
【发布时间】:2016-08-08 19:12:31
【问题描述】:

由于页面的每个部分都隐藏在 show hide div 中,因此一直在尝试让成员配置文件管理区域使用 ajax。

我之前在 MVC 应用程序中使用过 ajax,但之前从未将它与 umbraco 表面控制器一起使用过。我不确定为什么在控制器中返回部分视图会输出整个页面,而不仅仅是我给它的部分视图。

控制器:

        [HttpPost]
        [ActionName("MvcMemberEditProfileDetails")]
        public ActionResult MvcMemberEditProfileDetails(MvcMemberEditProfileDetailsModel model)
        {

            var memberService = Services.MemberService;
            var currentUser = Membership.GetUser();
            var member = memberService.GetByEmail(currentUser.Email);

            bool result = false;

            if (ModelState.IsValid)
            {

                ...

            }

            if (result)
            {
                ...
            }


            return PartialView("MvcMemberEditProfileDetails", model);

        }

查看:

@model Umbraco714.Models.MvcMemberEditProfileDetailsModel


@using (Ajax.BeginForm("MvcMemberEditProfileDetails", "MvcMember", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "MvcMemberEditProfileDetails", InsertionMode = InsertionMode.Replace }))
{

    if (Model.Result != null)
    {

        if (Model.Result == true)
        {

            <div id="result" class="alert alert-success">
                @Html.Raw(Model.ResultMessage)
            </div>

        }
        else
        {

            <div id="result" class="alert alert-danger">
                @Html.Raw(Model.ResultMessage)
            </div>

        }

    }

    <div class="form-default">
        <div class="row">
            <div class="col-md-6">
                <div class="form-group">
                    @Html.LabelFor(m => m.FirstName)
                    @Html.TextBoxFor(m => m.FirstName)
                    @Html.ValidationMessageFor(m => m.FirstName)
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-group">
                    @Html.LabelFor(m => m.LastName)
                    @Html.TextBoxFor(m => m.LastName)
                    @Html.ValidationMessageFor(m => m.LastName)
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-group">
                    @Html.LabelFor(m => m.CompanyName)
                    @Html.TextBoxFor(m => m.CompanyName)
                    @Html.ValidationMessageFor(m => m.CompanyName)
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-group">
                    @Html.LabelFor(m => m.CompanyPosition)
                    @Html.TextBoxFor(m => m.CompanyPosition)
                    @Html.ValidationMessageFor(m => m.CompanyPosition)
                </div>
            </div>
            <div class="col-xs-12">
                <div class="form-group">
                    @Html.LabelFor(m => m.CompanyBio)
                    <span class="bs-tooltip" data-toggle="tooltip" data-placement="top" title="Max 1000 characters long"><i class="fa fa-info-circle" aria-hidden="true"></i></span>

                    @Html.TextAreaFor(m => m.CompanyBio, new { @rows = "4", @maxlength = "1000" })
                    @Html.ValidationMessageFor(m => m.CompanyBio)
                </div>

                @TempData["Status"]
                <div class="form-group nomargin">

                    <div class="text-right">

                        <button class="button" type="submit"><i class="fa fa-floppy-o" aria-hidden="true"></i> Update</button>

                    </div>

                </div>
            </div>

        </div>
    </div>

}

在表单之前我已经准备好需要包含的所有内容(据我所知),并且没有控制台错误。

    <script src="/scripts/jquery.js"></script>
    <script src="/scripts/bootstrap.min.js"></script>
    <script src="/scripts/jquery-val.js"></script>

    <script src="/scripts/jquery.unobtrusive-ajax.min.js"></script>

我还确保在 web.config 中将 UnobtrusiveJavaScriptEnabled 设置为 true,但是当我发布表单时,我仍然会得到一个完整的页面。

最初: When the page loads and the form shows

之后: When the form is submitted and the correct partial view is returned but inside of an entire

尽管它显然以某种方式工作,但我花了几个小时来研究这个问题,我感到非常震惊。

这有可能/已知的事情发生吗?我四处搜索,但找不到任何具有类似问题的主题,除非我只是措辞有误。

如果有人有任何想法,只是在寻找正确的方向?

【问题讨论】:

  • 替换html的html元素在哪里?
  • 它位于继承 Umbraco.Web.Mvc.UmbracoTemplatePage 的模板内。这真的是 div 的唯一特别之处,无论如何这有帮助吗?
  • 您的 ajax 表单视图是否已加载到该 div 中?
  • 是的,我想要的部分视图确实被加载到该 div 中,但与站点的其余部分一起,好像它有一个布局,但我特别尝试在之前放置 layout = null 但是什么目前正在发生 仍然发生。

标签: c# ajax umbraco umbraco7 surface-controller


【解决方案1】:

Umbraco 可以用偏音来搞笑。尝试在控制器中返回 CurrentUmbracoPage()。

对于消息,您可以使用 TempData,因为它只持续一个请求,而不是模型。

【讨论】:

  • 返回 CurrentUmbracoPage() 不起作用,因为我只需要更新少量页面以保持当前活动的 div 打开。以我的经验,这感觉应该是这样做的方法,并且使用 tempdata 不会像通过模型并返回带有结果和已保存/未保存信息的部分那样实用。你还记得人们在哪里讨论过在 umbraco 中表现滑稽的部分吗?还是仅仅来自你的个人经历?
  • 有趣的是,无论如何我只是尝试返回 CurrentUmbracoPage() 并且得到了非常相似的结果。我有一种感觉,不知何故,我的部分布局正在输出,这既有意义又毫无意义,因为如果添加了一个布局,我什至如何控制或删除布局。
  • 不幸的是,部分表现奇怪是来自个人经验。正如您所说,听起来好像视图也在后台渲染。如果归根结底,我会使用 JS 通过 Ajax 调用 UmbracoApiController 并返回一个包含该消息的对象。抱歉无法解决这个问题。
  • 如果我只想用这些部分更新表单,那可能是最好的选择(我之前有一些类似的东西。)但我一直希望以后用它们做一些更复杂的事情我真的很想看到它以应有的方式工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多