1

我已经在我的 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 中,我“解决”了问题...... ..但我不知道为什么第一个不起作用

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

4

2 回答 2

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>
于 2013-04-09T11:38:04.897 回答
0

通常你会有一个 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" });

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

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

以下链接汁可能会有所帮助: 如何在 ASP.NET MVC 中枚举表单集合?

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

于 2013-04-04T19:32:40.630 回答