2013-05-13 97 views
2

我有一个局部视图。它的型号是一本书的对象和客户对象HTML.BeginForm不会调用控制器asp.net MVC 4

我试图用一个输入类型=用下面的提交按钮:

@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(); 
      } 

     }); 

我需要重新分配用户输入的值到Book模型之前我叫Ajax的方法,但是我不确定如何做到这一点。我传递这两个图书和用户模型回控制器作为

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 

谢谢 提前!

回答

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', 

然后你会被张贴该使用者输入值。

+0

这仍然不能解释为什么输入按钮不起作用,但为此,您需要用视图和控制器操作中使用的模型来更新问题。 – 2013-05-13 18:26:13

+0

是的,我有:var values = $('#formId')。serialize();有没有一种方法可以在Jquery中使用它来更新模型,其效果如下:@Model.Customer = values; 这样,当我发送:JSON.stringify({model:@ Html.Raw(Json.Encode(Model))}),它将被更新为正确的值。 – alpha 2013-05-13 18:47:25

+0

@alpha,我已经更新了答案,因此它更好地解释了要做什么。 – 2013-05-13 18:53:20

0

安装Fiddler(http://fiddler2.com/get-fiddler),看看您点击提交按钮时是否有请求。如果没有,那么你有客户端问题,例如你的提交按钮超出了你使用的BeginForm语句。

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

在任何情况下小提琴手是你最好的朋友,它会告诉你什么是失败,在那里...

+0

嗨,是的,我确实有模型参数的HttpPost属性和使用的提琴手和控制器没有被调用(请求未作出) – alpha 2013-05-13 17:47:57

+0

您的提交按钮内使用BeginForm语句?你有任何javascript/jquery代码覆盖提交按钮的行为,它不执行提交? – Marko 2013-05-13 17:53:07

+0

按钮是在开始表单和我的输入按钮: alpha 2013-05-13 17:55:24

0

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

相关问题