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

Asp.net mvc 4 HTML.BeginForm不调用控制器asp.net MVC 4,asp.net-mvc-4,Asp.net Mvc 4,我有一个片面的看法。它的模型是一个Book对象和Customer对象 我已尝试使用input type=submit按钮进行以下操作: @using (Html.BeginForm("GetBooks", "Home", FormMethod.Post, new { id = "formId" })) { } 我可以使用var values=$('#formId')获取用户输入的值 但是当点击按钮时,控制器不会被调用 因此,我决定使用jquery ajax()方法,通过调用控制器并传入模型

我有一个片面的看法。它的模型是一个Book对象和Customer对象

我已尝试使用input type=submit按钮进行以下操作:

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

}
我可以使用
var values=$('#formId')获取用户输入的值

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

因此,我决定使用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模型,但我不确定如何做到这一点。我将书籍和客户模型传递回控制器,如中所示

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
提前谢谢

安装Fiddler(),然后在单击提交按钮时查看是否有请求。如果没有,那么您就有一个客户端问题,例如,您的submit按钮不在using BeginForm语句的范围内

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


在任何情况下,Fiddler都是您最好的朋友,它会告诉您什么失败了,在哪里……

除了

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',
然后您将发布用户输入的值。

我们知道.BeginForm()扩展方法将创建一个表单标记,从而将表单级方法与页面关联。我一直在想MVC3中Html.BeginForm()和Ajax.BeginForm()方法的区别到底是什么。读了很多博客,每个人都说只有一件事,在Ajax表单中,表单是使用Javascript异步提交的。所以,这篇文章是为了验证同样的事情。

您好,是的,我确实有带有模型参数的HttpPost属性,并且未调用used Fiddler and controller(未发出请求)。您的submit按钮是否在using BeginForm语句中?您是否有任何javascript/jquery代码将提交按钮行为覆盖到不执行提交的位置?按钮位于开始表单和我的输入按钮内:因为我似乎无法使用begin提交。。是否可以使用jquery将用户输入值分配给模型?您可以发布您在操作和表单上使用的模型吗?这仍然不能解释为什么输入按钮不工作,但为此,您需要使用您在视图和控制器操作中使用的模型更新您的问题。是的,我有:var值=$(“#formId”).serialize();有没有一种方法可以在Jquery中获取值并用它更新模型,效果是:@model.Customer=values;这样当我发送时:JSON.stringify({model:@Html.Raw(JSON.Encode(model))}),它将被更新为正确的值。@alpha,我已经更新了答案,以便更好地解释要执行的操作。我的表单只有html.helpers for Customer。因此,当我使用$('#formId').serialize()时,我获得了用户为Customer对象输入的值。但是,我的控制器采用Customer和Book对象的模型。我想我可以删除Book对象,然后在控制器中重新创建它,而不是尝试传递它。谢谢。您的解决方案是我的另一个选择。