HTML.BeginForm不调用控制器asp.net MVC 4

时间:2013-05-13 17:09:21

标签: asp.net-mvc-4

我有部分观点。它的Model是Book对象和Customer对象

我尝试使用带有以下内容的输入类型=提交按钮:

@using (Html.BeginForm("GetBooks", "Home", FormMethod.Post, new  { id = "formId" }))
{

}

我可以使用var values = $('#formId').serialize();

获取用户输入的值

但是当点击按钮时,控制器不会被调用。

所以,我决定使用jquery ajax()方法,它似乎工作正常,通过调用控制器并传入模型。但是,它不会将更新的模型(使用用户条目更新)发送到控制器。

ajax的例子:

$.ajax({          
           url: "/Home/GetBooks",
            data:  JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) ,
           type: 'POST', 
           contentType: 'application/json',

            beforeSend:function(){  
                $("#loading").show();
            },
            success: function(data) {    
                append(data)
            },
            error: function (e, textStatus, jqXHR) {
                $("#loading").hide();
                alert(e.statusText);
            },           
            complete:function(){               
                $("#loading").hide();
            }

        });

在调用Ajax方法之前,我需要将用户输入的值重新分配给Book Model,但我不确定如何执行此操作。我将Book和Customer Model传递回控制器,如

所示
JSON.stringify({model: @Html.Raw(Json.Encode(Model))}) 

控制器:

[HttpPost]
public ActionResult GetBooks(ModelObjects model)
{

}

型号:

public class ModelObjects
    {
        public MVC4App.Models.Customer Customer{ get; set; }
        public MVC4App.Models.Book Book{ get; set; }
    }

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

    }

 public class Book
    {
        public string Name{ get; set; }
    }

视图中的模型参考:

@model MVC4App.Models.ModelObjects

提前致谢!

3 个答案:

答案 0 :(得分:1)

除了

之外,使用ajax方法所做的几乎是正确的
data:  JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) 

将导致您继续发布的硬编码json。事情是@Html.Raw(Json.Encode(Model))将是一个字符串生成的服务器端,在渲染视图时(只需看一下网页的来源)。

所以,改变

url: "/Home/GetBooks",
data:  JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) ,
type: 'POST', 
contentType: 'application/json',

类似于:

url: "/Home/GetBooks",
data: $('#formId').serialize(), // or JSON.stringify($('#formId').serialize())
type: 'POST', 
contentType: 'application/json',

然后您将发布用户输入的值。

答案 1 :(得分:0)

安装Fiddler(http://fiddler2.com/get-fiddler)并查看单击提交按钮时是否有请求。如果没有那么你有一个客户端问题,例如你的提交按钮不在你使用的BeginForm语句之外。

如果正在提出请求,那么您需要查看控制器操作路由以及是否正确。还要确保您的操作使用HttpPost属性进行修饰,并且它接受正确的模型参数。你能在这里发布控制器动作代码吗?

无论如何,Fiddler是你最好的朋友,它会告诉你什么是失败的,在哪里......

答案 2 :(得分:0)

我们知道.BeginForm()扩展方法将创建一个表单标记,从而将表单级方法与页面相关联。我一直想知道MVC3中Html.BeginForm()和Ajax.BeginForm()方法之间究竟有什么区别。阅读许多博客,每个人只说一件事,在Ajax表单中,表单是使用Javascript异步提交的。所以,这篇文章是为了验证同样的事情。 http://www.codeproject.com/Articles/429164/Html-BeginForm-vs-Ajax-BeginForm-in-MVC3