【问题标题】:html.beginForm does not call controller methodhtml.beginForm 不调用控制器方法
【发布时间】:2013-04-09 19:38:04
【问题描述】:

我已经在我的 asp.net mvc 4 上工作了一段时间,但我遇到了一个问题...实际上我有两个相关的问题...让我们先从简单的开始。

我有很多视图和所有工作,除了这个....我已经将它剥离并简化了尝试查找错误...但以下仍然不是调用控制器方法:

@using TBS.Etracs.Web.Main.Areas.WorkOrder.Models
@model WorkOrderInputModel

@{
    ViewBag.Title = "Work Orders Per Pad";
}

@using (Html.BeginForm("StartWorkOrderTask", "Mobile", 
         new {WorkCenterID=Model.WorkCenterID, VIN=Model.VIN })) 
{   
        <div>
        <label><strong>WorkCenterID:</strong></label>
        <label>@Model.WorkCenterID</label>
    </div>

    <div>
        <label><strong>VIN:</strong></label>
        <label>@Model.VIN</label>
    </div>

    <input type="submit" value="Start Work Order" />
}

控制器方法是一个名为“MobileController”的控制器,这里是方法签名:

 [HttpPost]  //Tried with and without this attribute...
 public ActionResult StartWorkOrderTask(int WorkCenterID, string VIN)
    {
    }

我在控制器方法中设置了一个断点....输入时它永远不会被调用 表单上的按钮被点击....

我以前见过这种问题是由以下原因引起的: 1) 有多个 beginForm 2) 没有包含正确的 javascript 文件 3) 样式参数 ....我不知道为什么,但包括一些样式 控件导致输入按钮不起作用... 4) 我确定我打过其他人,但他们现在没有想到....

我使用 firebug 检查了 html,但没有发现任何问题...它正在创建一个带有指向该方法的 dataurl 的表单...并填写了 WorkCenterID 和 VIN 的值...什么可能导致probem??????

有没有人建议看看什么或尝试调试什么?

我的第二个问题也涉及到控制器方法的调用......我知道我们应该能够拥有这样的方法:

   public ActionResult StartWorkOrderTask(WorkOrderInputModel model)

beginForm 上的这个

@using(Html.BeginForm("StartWorkOrderTask", "Mobile"))

但是大约 90% 的情况下,当我这样做时,控制器方法确实会被调用......我点击了输入按钮,但没有任何反应......通过将参数显式放入 beginForm 我“解决”了问题....但我不知道为什么第一个不起作用

我没有为路线定义任何特殊的东西......只是使用了默认......我正在使用区域,但我在命名时很小心,所以没有冲突......

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    通常你会有一个 get 和一个 post,你的 get 将使用与你的 post 相同的模型,然后可以像这样运行:

    public ActionResult StartWorkOrderTask(WorkOrderInputModel model)
    

    其中 workorderinputmodel 是您的 VIEW 模型,这将允许简单:

    @using(Html.BeginForm())
    

    而且您也不需要任何自定义路线。然而与

    public ActionResult StartWorkOrderTask(int WorkCenterID, string VIN)
    {
    }
    

    您需要这样的自定义路线:

    routes.MapRoute("Nameforthis", "area/Controller/View/{WorkCenterID}/{VIN}", new { controller = "namehere", action = "namehere" });
    

    注意字符串 {} 中的属性名称这允许自动映射。

    另一种解决方案是采用表单值集合并且不传递任何路由值,然后您可以读取它的属性。

    以下链接果汁可能会有所帮助:How can a formcollection be enumerated in ASP.NET MVC?

    最后,您是否收到 404 或错误,或者您的表单根本没有提交? 此外,您是否检查了呈现的 HTML 以查看您的代码生成的帖子 URL 是什么。

    【讨论】:

    • 我理解你所说的关于获取和发布的内容......我确实有创建屏幕并等待输入的获取......我只是没有提到这个......我专注于处理来自屏幕的信息......这是帖子的来源......我希望我需要有 [HttpPost] 属性来指定帖子,但我注意到的是代码似乎与我不明白的 HttpPost 或与我不明白的工作相同......
    • (空间不足)......我感到困惑的另一点是路线......我理解你所说的需要自定义路线......但是事情让我感到困惑的是,当我从模型转换为原始类型集时,代码(通常)有效……我也从模型开始,当我遇到问题时将其转换为原始类型(不修改路由)……代码开始工作??????我没有收到任何错误...代码只是挂起...我按下按钮并没有任何反应...没有调用控制器方法,但没有错误...是的,我检查了呈现的 html
    • (空间不足)......无论如何呈现的 HTML 看起来不错......在上面的示例中,它是一个简单的表单,它发布到控制器方法 public ActionResult StartWorkOrderTask(int WorkCenterID,字符串 VIN)
    • 您是否尝试过 fiddler 以确保没有发生 http 错误,看起来很奇怪。最奇怪的部分是您将新的 {WorkCenterID=Model.WorkCenterID, VIN=Model.VIN }) 添加到您的 html 表单中,但随后也具有下面的表单,实质上使您的模型加倍。至于路由,我总是使用路由,如果我的操作包含任何不是模型、formcollection 或 int id 的东西,而且我在发布时从来没有遇到过问题。
    • 我没用过 fiddler...但是我用 firebug 和 glimpse 来查看实际的 html,我没有看到任何错误...我会在星期一发布 firebug 输出回去工作....感谢您的帮助...
    【解决方案2】:

    我仍然对原因一无所知....这是萤火虫的输出:

    <!DOCTYPE html>
    <html class="ui-mobile">
    <head>
    <base href="http://localhost:58028/WorkOrder/Mobile/ViewWorkOrdersByPad?WorkCenterID=159">
    <meta charset="utf-8">
    <title>Work Orders Per Pad</title>
    <meta content="width=device-width, initial-scale=1" name="viewport">
    <link href="/Content/Mobile/css/jquery.mobile-1.2.0.min.css" rel="stylesheet">
    <link href="/Content/Mobile/css/jquery.mobile-1.2.0.css" rel="stylesheet">
    <link href="/Content/Mobile/css/jquery.mobile.theme-1.2.0.css" rel="stylesheet">
    <link rel="stylesheet" href="/Content/Site.Mobile.css">
    <link rel="stylesheet" href="/Content/Mobile/css/jquery.mobile-1.2.0.css">
    <link rel="stylesheet" href="/Content/Mobile/css/jquery.mobile.structure-1.2.0.css">
    <link rel="stylesheet" href="/Content/Mobile/css/jquery.mobile.theme-1.2.0.css">
    <script src="/Scripts/jquery-1.7.1.js">
    <script src="/Scripts/jquery.mobile-1.3.0.min.js">
    <script>
    </head>
    <body class="ui-mobile-viewport ui-overlay-c">
    <div class="ui-page ui-body-c ui-page-active" data-theme="c" 
     data-role="page" data-url="/WorkOrder/Mobile/ViewWorkOrdersByPad?WorkCenterID=159"
     tabindex="0" style="min-height: 321px;">role=
    
    "page" theme="c"
    
    mobilePage=Object { element={...}, uuid=1, eventNamespace=".page1", more...}title=
    
    "Work Orders Per Pad"
    
    <div class="ui-loader ui-corner-all ui-body-a ui-loader-default">
     mobileLoader=Object { element={...}, uuid= 0, eventNamespace=".loader0", more...}
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2014-11-14
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多