【问题标题】:Ajax.BeginForm with 4 arguments not finding the action method带有 4 个参数的 Ajax.BeginForm 找不到操作方法
【发布时间】:2017-10-05 14:31:24
【问题描述】:

我有一个奇怪的案例,我希望得到您的启发。 我有两个控制器。一个人控制器用于一般人员使用操作方法,一个候选控制器用于与候选人相关的更具体的操作方法。 我使用位于 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 中,它会再次正常工作。但是我想知道为什么会这样。我做了一些挖掘,但我没有设法得到答案。

从萤火虫我看到浏览器尝试发布的网址是出于某种原因

http://{ProjectName}/Person/SaveCandidateLanguage?Length=9

而不是

http://{ProjectName}/Candidate/SaveCandidateLanguage?Length=9

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

【问题讨论】:

    标签: c# asp.net-mvc razor html-helper ajax.beginform


    【解决方案1】:

    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"的原因是因为“候选”包含9个字符,长度是字符串的唯一属性

    【讨论】:

    • ?length="9"的原因是因为“候选人”包含9个字符,而lengthstring的唯一属性
    • 感谢您的回答!现在它是有道理的。 :) 从我看到的第二种方法中只有一件事可能是 Ajax.BeginForm(string actionName, string Controller, object routeValues, AjaxOptions options, object htmlAttributes) 对吧?为了澄清答案。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2013-02-27
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多