MVC Ajax表单返回View的全部内容

时间:2012-05-25 11:58:35

标签: c# jquery .net ajax asp.net-mvc-4

我正在使用MVC4。在我的项目中启用并引用了不引人注目的JavaScript。 Ajax脚本正在我的共享母版页中加载。 FireBug报告没有错误或404。

我在页面中添加了Text框,用于更新Hidden表单中Ajax字段的内容。当用户按下某个键并触发KeyUp事件时,我会通过调用强制我的Ajax表单提交:

$("form#ajaxForm").trigger("submit");

其中 ajaxForm 是Ajax表单的名称。这很好用。表格在幕后提交,我的控制器事件触发。根据用户的输入,使用新数据更新模型。

然而,奇怪的是,当结果返回到我的表单时。我的表单div标记的全部内容都被结果替换 - 这是整个页面。

<div id="basic-modal-content"">
   <input id="breed" type="text"/>
<div>
<form id="ajaxForm" method="post" data-ajax-update="#results" data-ajax-mode="replace" data-ajax="true" action="/Poultry/ListBreeds?Length=7">
   <div id="results">
    ->THIS AREA IS GETTING REPLACED WITH THE ENTIRE FORM <-
      <div id="basic-modal-content">
      </div>
   </div>
</form>
  • 请注意 basic-modal-content 现在如何包含自己,另一个 basic-modal-content 。结果div应该只包含更新结果,而不是整个视图 - 显然。

我的代码如下:

查看 BreedSelectorPartial.cshtml

@model IQueryable<Inert.BreedViewModel>

<script type="text/javascript">
    $(document).ready(function () {
        $("#breed").keyup(function (e) {
            $("input[name=breedSearch]").val($("#breed").val());
            $("form#ajaxForm").trigger("submit");
        });
    });
</script>

<div id="basic-modal-content">
<input id="breed" type="text" style="width:100%; height:22px;" />
    <div>
        <div style="margin-top: 4px;">
            <label for="breed">Begin by typing a breed, e.g. <span style="font-style: italic">Wyandotte</span></label>
        </div>
    </div>
    @using (Ajax.BeginForm("ListBreeds", "Poultry", new AjaxOptions {UpdateTargetId = "results" }, new { id = "ajaxForm" }))
    {
        <input id="breedSearch" name="breedSearch" type="hidden" />
    }
    <div id="results" style="height: 320px; color: black; margin-top: 12px; font-size: 18px;">
        @{
            var grid = new WebGrid(Model, ajaxUpdateContainerId: "results");
            int c = Model.Count();
         }
        @grid.GetHtml(tableStyle: "webgrid",
            alternatingRowStyle: "webgrid-alternating-row",
            rowStyle: "webgrid-row-style",
            displayHeader: true)
    </div>
</div>
<script type="text/javascript" src="/scripts/jquery.simplemodal.js"></script>
<script type="text/javascript" src="/scripts/basic.js"></script>

控制器 PoultryController.cs

[HttpPost]
public ActionResult ListBreeds(string breedSearch)
{
    InertDatabaseEntitiesConnection db = new InertDatabaseEntitiesConnection();
    var breeds = db.Breeds.Where(q => q.Name.Contains(breedSearch));
    var names = breeds.Select(q => new BreedViewModel { Name = q.Name });
    return PartialView("BreedSelectorPartial", names);
}

我不确定我在哪里出错了。我花了好几个小时试图解决这个问题。任何解决方案?

3 个答案:

答案 0 :(得分:11)

第一个问题是你正在使用Ajax.BeginForm帮助程序的错误重载(但这不会引起不良行为,它只是一个旁注):

@using (Ajax.BeginForm(
    "ListBreeds",                                      // actionName
    "Poultry",                                         // routeValues
    new AjaxOptions { UpdateTargetId = "results" },    // ajaxOptions
    new { id = "ajaxForm" })                           // htmlAttributes
)

而你需要:

@using (Ajax.BeginForm(
    "ListBreeds",                                      // actionName
    "Poultry",                                         // controllerName
    null,                                              // routeValues
    new AjaxOptions { UpdateTargetId = "results" },    // ajaxOptions
    new { id = "ajaxForm" })                           // htmlAttributes
)

现在真正的问题是你需要将#results div 放在之外的部分和主视图中:

<div id="results" style="height: 320px; color: black; margin-top: 12px; font-size: 18px;">
    @Html.Partial("BreedSelectorPartial")
</div>

当然,如果您只需要更新WebGrid部分,那么将网格仅留在局部内部并在主视图中将窗体移到外面会更有意义。

所以你的主视图现在变成了:

@model IQueryable<BreedViewModel>
<script type="text/javascript">
    $(document).ready(function () {
        $("#breed").keyup(function (e) {
            $("input[name=breedSearch]").val($("#breed").val());
            $("form#ajaxForm").trigger("submit");
        });
    });
</script>

<div id="basic-modal-content">
    <input id="breed" type="text" style="width:100%; height:22px;" />
    <div>
        <div style="margin-top: 4px;">
            <label for="breed">Begin by typing a breed, e.g. <span style="font-style: italic">Wyandotte</span></label>
        </div>
    </div>
    @using (Ajax.BeginForm("ListBreeds", "Poultry", null, new AjaxOptions { UpdateTargetId = "results" }, new { id = "ajaxForm" }))
    {
        <input id="breedSearch" name="breedSearch" type="hidden" />
    }
    <div id="results" style="height: 320px; color: black; margin-top: 12px; font-size: 18px;">
        @Html.Partial("BreedSelectorPartial")
    </div>
</div>

并且唯一需要更新的部分是包含网格的BreedSelectorPartial.cshtml部分:

@model IQueryable<BreedViewModel>
@{
    var grid = new WebGrid(Model, ajaxUpdateContainerId: "results");
}
@grid.GetHtml(
    tableStyle: "webgrid",
    alternatingRowStyle: "webgrid-alternating-row",
    rowStyle: "webgrid-row-style",
    displayHeader: true
)

答案 1 :(得分:0)

前几天我有类似的东西。

我不记得确切的问题是什么,但它与返回整个对象而不仅仅是对象的HTML元素有关。

我目前无法找到代码,但如果您使用的是Firebug或类似的东西,请查看您是否可以监视返回的数据,如果我正确记得我需要做的就是将.html添加到结束了。

对不起它有点模糊,但希望它会对你有所帮助。

答案 2 :(得分:0)

你确定你没有提交常规表格吗?我认为这一行$("form#ajaxForm").trigger("submit"); 正在做常规表单提交。你应该在这里做一个ajax表单,而不是调用普通表单提交。您正在看到整个页面重新加载。