Ajax.BeginForm 有 4 个参数未找到操作方法

Ajax.BeginForm with 4 arguments not finding the action method

我有一个奇怪的案例,我希望你的启发。 我有两个控制器。一个 Person Controller 用于一般 Person 使用操作方法,一个 Candidate Controller 用于与 Candidate 相关的更具体的操作方法。 我使用位于 Person 文件夹下的一个局部视图,以便用作通用视图,以防将来我想将它用于其他类型的 Person。 目前,此部分视图使用 Ajax.BeginForm 以候选控制器为目标。我使用的语法是

@using (Ajax.BeginForm("SaveCandidateLanguage", "Candidate",
    new AjaxOptions
    {
        HttpMethod = "Post",
        OnBegin = "onBeginFormValidation",
        OnSuccess = "onSaveCandidateLanguageSuccess"
    }))
{
    // form input elements
}

这种类型的 Ajax.BeginForm 可以正常工作,尽管它针对的是不同控制器中的操作。 现在为了我的表单验证,我不得不向我的 Ajax.BeginForm 添加更多参数。我的新语法是这样的:

@using (Ajax.BeginForm("SaveCandidateLanguage", "Candidate",
    new AjaxOptions
    {
        HttpMethod = "Post",
        OnBegin = "onBeginFormValidation",
        OnSuccess = "onSaveCandidateLanguageSuccess"
    },
    new
    {
        id = "addEditCandidateLanguageForm",
        novalidate = "novalidate"
    }))
{
   // form input elements
}

由于某种原因,这种方式无法找到 Action 方法。如果我将我的动作放在 Person Controller 中,它会再次正常工作。但是我想知道为什么会这样。我做了一些挖掘,但我没有设法得到答案。

来自 firebug 我看到 url 浏览器尝试 post 是出于某种原因

http://{项目名称}/Person/SaveCandidateLanguage?长度=9

而不是

http://{项目名称}/Candidate/SaveCandidateLanguage?长度=9

我自然会收到 404 Not found 响应。我还想知道我在 url 末尾看到的变量 ?Length=9 是什么,它来自哪里。

Ajax.BeginForm 有 11 个不同的声明。 在你的第一种情况下,它起作用是因为你使用了这个:

Ajax.BeginForm(string actionName, string controllerName, AjaxOptions options)

但是第二种情况你使用了这个,试图在 object routeValues 参数中放入一个字符串:

Ajax.BeginForm(string actionName, object routeValues, AjaxOptions options, object htmlAttributes)

最后,您要使用的声明是:

Ajax.BeginForm(string actionName, string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)

使用 null 值实现,例如:

Ajax.BeginForm("SaveCandidateLanguage", "Candidate", null,
new AjaxOptions
{
    HttpMethod = "Post",
    OnBegin = "onBeginFormValidation",
    OnSuccess = "onSaveCandidateLanguageSuccess"
},
new
{
    id = "addEditCandidateLanguageForm",
    novalidate = "novalidate"
}))

?length="9"的原因是因为"Candidate"包含9个字符,长度是string

中唯一的属性