我有一个奇怪的案例,我想要你的启蒙。 我有两个控制器。一般人员控制器使用行动方法和一个候选人控制器,用于与候选人相关的更具体的行动方法。 我使用位于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我看到浏览器尝试发布的网址是出于某种原因
http:// {ProjectName} / Person / SaveCandidateLanguage?Length = 9
而不是
的http:// {项目名} /候选/ SaveCandidateLanguage长度= 9
然后我自然得到404 Not found响应。我还想知道变量是什么?我在网址的末尾看到的长度= 9,它来自何处。
答案 0 :(得分:6)
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个字符而length是字符串的唯一属性