在MVC中使用HttpPost时出现“找不到资源”的错误

4

我看到我的问题是一个常见的错误,并尝试了许多解决方案,但对于我来说仍然不起作用。因此,从头开始说起,我在一个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);
    }
}

正如我所说,我尝试了其他帖子中的其他答案,这些答案似乎适用于发布者,但我仍然遇到问题。我错过了什么吗?

附言:在查看源代码时,我看到表单标签如下:

<form method="post" action="690" id="form1">

当操作应指向MyAction时。我如何设置Html.BeginForm以指向“ MyAction”?
1个回答

4
问题在于操作的id参数是一个int(值类型),它不能被传递为null引用。因此,您需要在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"})) %>

是的,那就是问题所在。但我想让操作读取 action="MyAction" 而不是 action="690"。我不明白将其设置为0或null如何解决我的问题。你能发一个例子吗? - user2284341
1
@marceln 我正要添加一个与你最后一次编辑基本相同的答案,所以我加了一点不同于你的部分。如果您不同意,请回滚编辑。 - Tieson T.
@user2284341:你上面有两个示例,随便选一个吧 : )。它们都可以工作。 - Marcel N.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接