C#MVC 3部分视图未击中控制器方法

时间:2013-01-22 18:17:33

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

我有一个创建用户页面 - 它当前列出了一个包含系统中所有当前用户的表。我可以单击创建新按钮 - 这是一个jQuery ajax提交,它调用我的控制器方法并返回一个局部视图并加载新的模态jQuery对话框,其中包含所有字段,如Forename,Surname等。所以我有我的表在在模态视图中屏幕中心的背景和此对话框,因此它优先。如果单击用户名,则相同的方法称为excpet,传入uniquie用户ID,因此对话框表单未加载空白 - 它从DB加载用户的当前详细信息,并且用户ID是否有删除按钮添加到用户对话框以及创建新的保存和取消。

现在出现问题 - 我已将我的部分视图页面包含在下面 - 我还将自己的js添加到局部视图中,因为我需要根据用户做出的一些选择来显示/隐藏差异下拉框。

@using (Html.BeginForm("UserAction", "Admin", FormMethod.Post, new { id = "userActionForm" }))
{
//Fields on the dialog box....
}
然后在对话框上的

- 我有按钮,即

<input id="DoDeleteUser" type="button" class="dialog-button" value="Delete User" style="margin: 5px" />

然后在我的页面的JS文件中,我有以下内容:

         $('#DoDeleteUser').click(function (event) {
          //alert("Delete Button Pressed"); - In for debugging
        $('#userID').val($(event.target).attr("userId")); - get id value into hidden field on page
        $('action').val('Delete'); - put action string into hidden field on page
        $('#userActionForm).submit();

      });

    $('#userActionForm').submit(function () {

       var formData = $("#userActionForm").serializeArray();

        $.ajax({
                url: this.action,
                type: this.method,
                data: formData,
            success: function (result) {
                $('#dialogContainer').html(result);
            }

        });
       return false;
});

我的对话框容器是第一个页面加载的容器,当我从UserAction方法返回时,我想要更新一个容器,其中包含一条简单的消息“User Updated”或“User Deleted”和一个OK按钮,当点击它时刷新整个页面(这样主表就会更新)

然后在我的控制器上我有如下方法:

   public ActionResult UserAction(UserModel model)
    {

        if (ModelState.IsValid)
        {
              if(model.Action == "Delete")

               //Go and do delete
               return PartialView ("UserActionSuccess", model);

          //close if etc etc

但是我在我的控制器中的UserAction方法上设置了一个断点,但是当我点击“删除用户”按钮或“保存用户”按钮时它永远不会被击中。这是我被困住了。

2 个答案:

答案 0 :(得分:0)

您正在发送包含表单数据的帖子,但您希望UserAction上有一个模型(json对象)。您应该使用参数来匹配表单输入。

public ActionResult UserAction(string id)
{
    ...
}

答案 1 :(得分:0)

您应该考虑为CRUD方法使用消息类。它应该使逻辑更清洁。

public class CreateUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class DeleteUser
{
    public int UserId { get; set; }
}

然后你会对每个CRUD方法都有一个控制器动作,如下所示:

public ActionResult Create(CreateUser message)
{
}

public ActionResult Delete(DeleteUser message)
{
}

在jQuery中,您将按如下方式准备AJAX调用:

$.ajax({
    url: "/yourcontroller/create",
    type: "POST",
    data: formData,
    success: function() { console.log('success'); },
    error: function() { console.log('error'); }
});

$.ajax({
    url: "/yourcontroller/delete/" + $("#userId").val(),
    type: "DELETE",
    success: function() { console.log('success'); },
    error: function() { console.log('error'); }
});

最后,一旦你连接起来,你可以使用Firebug检查jQuery方面的事情,然后在VS管理员模式下使用断点来确保调用正确填充你的消息对象。