html.beginForm不调用控制器方法

时间:2013-04-04 16:55:17

标签: asp.net-mvc-4

我已经在我的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的值...什么可能导致探测??????

是否有人建议查看什么或尝试调试此内容?

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

   public ActionResult StartWorkOrderTask(WorkOrderInputModel model)

这个在beginForm上

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

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

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

2 个答案:

答案 0 :(得分:0)

通常你会有一个获取和一个帖子,你的获取将使用与你的帖子相同的模型,然后可以这样运行:

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或错误,或者你的表单根本不提交? Alos让您检查呈现的HTML以查看代码生成的帖子URL。

答案 1 :(得分:0)

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

<!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>