在ajax发布后,我有显示结果的问题

时间:2012-04-07 07:39:07

标签: asp.net-mvc

我有一个名为 Index.cshtml 的视图,其中包含一个用户表(创建/编辑/更新功能)。

enter image description here

当点击按钮(创建/编辑/更新)时,我有一个jQuery对话框。接下来我使用像这样的ajax帖子:

  • 编辑>>调用动作控制器进行编辑并返回json>>用javascript更新行表
  • 删除>>调用一个动作控制器来删除并返回一个json>>用javascript删除行表
  • 创建>>调用动作控制器来创建和重定向到Index.cshtml>> ???

对于创建部分,我遇到了一个问题:我希望“只是”显示我的视图,但我在ajax帖子中。我不知道该怎么办。

这是我的代码(提交数据然后刷新视图):

        $.post($(this).attr('action'), $(this).serialize(), function (data, status) {
            $('#my-modal').modal('hide');

            if (data.operation == 'edit') {
                // Edit
                var row = $('#' + data.userid);
                row.children(':eq(0)').text(data.company);
                row.children(':eq(1)').text(data.username);
                row.children(':eq(2)').text(data.email);
                row.children(':eq(3)').text(data.firstname);
                row.children(':eq(4)').text(data.lastname);
            } else if (data.operation == 'delete') {
                // Delete
                var row = $('#' + data.userid);
                row.remove();
            } else {
                // Create
                alert(data);
                $("#userList").html(data);
            }
        })

正如您所看到的,我检查了data.operation,它告诉我是否“编辑”或“删除”(最后一种可能性)“创建”。对于创建问题,我的整个视图(< html>< body> ...)已生成并添加到我的#userList div中。这是重复的事情。

也许这不是正确的事情?

感谢。


已更新

以下是我的创建操作:

    [HttpPost]
    public ActionResult Create(UserCreateViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            this.Response.StatusCode = 400;
            return PartialView("Create", viewModel);
        }

        var userDTO = new UserDTO();
        Mapper.Map(viewModel, userDTO);
        _requestServiceClient.CreateNewUser(userDTO);
        return RedirectToAction("Index");
    }

这是我的索引操作:

    [Authorize]
    public ActionResult Index(string q, int? page)
    {
        var users = _requestServiceClient.GetUsers();
        ...
        ...
        if (Request.IsAjaxRequest())
            return PartialView(userListPaged);
        else
            return View(usersListPaged);
    }

在relexion之后,在'create'的情况下,或许在我看来更好地重新加载这样的页面:

            ...
            } else if (data.operation == 'create') {
                // Create >> refresh the page
                location.reload();
            }

非常感谢。

2 个答案:

答案 0 :(得分:0)

如果您的列表不是太长,我建议在每个ajax请求中发回完整列表,无论是更新,创建还是删除。

所以你可以删除你的数据操作检查(你的:eq(0)的东西如果你有一天改变列的顺序就会失败)并简单地将ajax请求的结果放在你的#userlist div中。

修改

但是要解决你的创建问题:

只需在此行的创建操作中替换:

return RedirectToAction("Index");

这一行:

return PartialView("Index", _requestServiceClient.GetUsers());

它应该只返回新列表。

<强> EDIT2

好的,你的Index.cshtml似乎有完整的布局,而不仅仅是我想的列表。所以你必须先做到这一点:

  1. 仅在单独的视图中移动构建列表所需的HTML代码,例如将其命名为_List.cshtml
  2. 在您的Index.cshtml中的HTML代码放置@Html.Partial("_List")的地方
  3. 此时您的索引视图应与之前的视图相同,但您的列表视图是单独的
  4. 将上面的示例更改为不返回索引但是_List部分: return PartialView("_List", _requestServiceClient.GetUsers());
  5. 我希望这适合你。

答案 1 :(得分:0)

将此代码放入部分视图中:

@{
    Layout = null;
}

此代码表示您不需要此页面的主视图。