【问题标题】:HTML.BeginForm does not call controller asp.net MVC 4HTML.BeginForm 不调用控制器 asp.net MVC 4
【发布时间】:2013-05-15 14:44:26
【问题描述】:

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

我尝试过使用 input type=submit 按钮:

@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

提前致谢!

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案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',
    

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

    【讨论】:

    • 这仍然不能解释为什么输入按钮不起作用,但为此您需要使用您在视图和控制器操作中使用的模型更新您的问题。跨度>
    • 是的,我有: var values = $('#formId').serialize();有没有办法在 Jquery 中获取值并用它更新模型,效果如下:@Model.Customer = values;这样当我发送时: JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) ,它将使用正确的值进行更新。
    • @alpha,我已经更新了答案,以便更好地解释要做什么。
    • 我的表单只有客户的 html.helpers。因此,当我使用 $('#formId').serialize() 时,我会得到用户为 Customer 对象输入的值。但是,我的控制器采用 Customer 和 Book 对象的模型。我想我可以删除 Book 对象,然后在 Controller 中再次创建它,而不是尝试将其传入。谢谢。您的解决方案对我来说是另一种选择。
    【解决方案2】:

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

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

    在任何情况下,Fiddler 都是你最好的朋友,它会告诉你哪里出了问题……

    【讨论】:

    • 嗨,是的,我确实有带有模型参数的 HttpPost 属性,并且没有调用 Fiddler 和控制器(未发出请求)
    • 您的提交按钮是否在 using BeginForm 语句中?您是否有任何 javascript/jquery 代码将提交按钮行为覆盖到它不执行提交的地方?
    • 按钮在开始表单和我的输入按钮内:
    • 因为我似乎无法使用 BeginForm 提交它。是否可以使用 jquery 将用户输入值分配给模型?
    • 你能发布你在动作和表单上使用的模型吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多