提交Ajax.BeginForm会将目标div替换为整个页面

时间:2017-07-17 18:51:08

标签: c# ajax asp.net-mvc

我有一个部分视图,其中包含用于获取插入/更新数据库记录的数据的表单。显示具有此部分视图的页面没有问题。填写数据并发布表单工作正常(记录正确保存到数据库中)。问题是虽然我返回一个局部视图(return PartialView();),但系统会用整个页面替换目标div(而不仅仅是部分视图)!!

从以上症状中,您可以理解:

  • 响应控制器是正确的(记录保存在数据库中)。
  • 不缺少必要的js脚本(确实是ajax替换了页面的一部分)

请注意,部分视图以Layout = ""开头(因此它不会引用任何布局)。我也使用Layout = null进行了测试,结果相同。

其他细节:

  • Visual Studio Community 2015
  • 容器页面通过Umbraco CMS实现。

部分视图

@using FLATS;

@model TMSCounterpartyModel
@{
    Layout = "";

    TMSCounterpartyModel myModel = (TMSCounterpartyModel)Model;

    Html.EnableClientValidation(true);
    Html.EnableUnobtrusiveJavaScript(true);

    AjaxOptions ajaxOpt = new AjaxOptions {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "frmEditCounterparty"
    };
}

@using(Ajax.BeginForm("HandlePost", "EditTMSCounterparty", null, ajaxOpt, new { @id="editCptyForm" }))
{

    @Html.AntiForgeryToken()

    <div class="row">

        <fieldset>
            @Html.HiddenFor(model => model.Id)

...

                <div class="row margin-top-20">
                    <div class="col-xs-10 col-xs-offset-1 col-sm-8 col-sm-offset-3 col-md-8 col-md-offset-2">
                        <input id="btnSubmit" type="submit" value="Save" class="form-control" />
                    </div>
                </div>

        </fieldset>

    </div>
}

控制器

public class EditTMSCounterpartyController : System.Web.Mvc.Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken()]
    public PartialViewResult HandlePost(TMSCounterpartyModel model)
    {
        string viewPath = Library.PartialViewFullPath("EditCounterparty.cshtml");

        if (ModelState.IsValid == false)
        {
            return PartialView(viewPath, model);
        }

        if (model.Save() == true)
        {
            TMSCounterpartyModel newModel = new TMSCounterpartyModel();
            newModel.LoadOrDefault(model.Id);

            return PartialView(viewPath, newModel); 
        }
        else
        {
            return PartialView(viewPath, model);
        }
    }
}

感谢任何帮助。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

最后,问题似乎与Map Routes有关。我添加了RouteTable.Routes.MapRoute("EditCpty", "EditTMSCounterparty/{action}", new { controller = "EditTMSCounterparty", action= "OpenForm" });,问题解决了。

虽然,我仍然不明白为什么MVC找到控制器,但它正在搞乱返回的PartialViewResult。反正。

谢谢大家的努力。