我发现我的问题是一个常见的错误,已经尝试了很多这个问题的答案,但它仍然不适合我。所以,从头开始,我在MVC项目中有一个部分表单,它使用Html.BeginForm帮助器:
<%using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new{@class = "form-class"}))
“MyAction”和“MyController”不是实际名称,但它们会在带下划线的名称确认时解析。我在控制器中的动作是:
[HttpPost]
public ActionResult MyAction(int id, FormCollection form)
{
EditedData dt = new EditedData();
// does some db submits and returns edited data
return View(dt);
}
所以,看起来常见的问题是,使用[HttpPost]会返回错误“无法找到资源”。我已经使用[HttpPost]进行了调试注释了哪些命中MyAction所以它不是路由(?)。我的global.asax尚未改变:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
正如我所说,我在其他帖子中尝试了其他答案,这些答案似乎适用于海报,但我仍然存在问题。我错过了什么?
P.S。在View Source中,我看到表单标记为:
<form method="post" action="690" id="form1">
当动作指向MyAction时。如何将Html.BeginForm设置为指向'MyAction'?
答案 0 :(得分:4)
问题是action的id
参数是一个int(值类型),它不能作为空引用传递。因此,您需要在BeginForm
调用中(在视图中)将其显式设置为0或使其可为空。
基本上,路由引擎无法根据您提供的数据(操作名称和控制器名称)+路由映射来解析操作和控制器。
示例(如果您决定将参数保留为int
):
<%using (Html.BeginForm("MyAction", "MyController", new { id = 0 }, FormMethod.Post, new { @class = "form-class" }))
此重载将匹配您在控制器中指定的签名。在编辑时,只需将0
替换为任何模型属性匹配;例如:
<% using (Html.BeginForm("MyAction", "MyController", new { id=Model.ID }, FormMethod.Post, new{ @class = "form-class"})) %>