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
中唯一的属性
我有一个奇怪的案例,我希望你的启发。 我有两个控制器。一个 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