2017-10-05 5 views
4

J'ai un cas étrange et je voulais votre illumination. J'ai deux contrôleurs. Un contrôleur de personne pour une personne générale utilise des méthodes d'action et un contrôleur de candidat pour des méthodes d'action plus spécifiques liées au candidat. J'utilise une vue partielle située dans le dossier Person afin d'être utilisée comme générique au cas où je souhaiterais l'utiliser à l'avenir pour d'autres types de personnes. Pour l'instant, cette vue partielle utilise un Ajax.BeginForm ciblant le contrôleur candidat. La syntaxe J'utilise estAjax.BeginForm avec 4 arguments ne trouvant pas la méthode d'action

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

Ce type de Ajax.BeginForm fonctionne correctement en dépit du fait qu'il vise une action dans un autre contrôleur. Maintenant, pour ma validation de formulaire, j'ai dû mettre plus d'arguments à mon Ajax.BeginForm. Ma nouvelle syntaxe est la suivante:

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

Pour une raison quelconque, cette méthode ne trouve pas la méthode Action. Si je mets mon action à l'intérieur du contrôleur de personne cela fonctionne correctement encore. Cependant je me demandais pourquoi est ce cas. J'ai creusé mais je n'ai pas réussi à obtenir une réponse à ce sujet.

De Firebug je vois que l'URL du navigateur tente de poster est pour une raison quelconque

http: // {} ProjectName/personne/SaveCandidateLanguage Longueur = 9

au lieu de

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

et naturellement j'obtiens une réponse 404 Non trouvée. Je me demandais aussi quelle est la variable? Length = 9 que je vois à la fin de l'url et d'où vient-elle.

Répondre

6

Ajax.BeginForm a 11 déclarations différentes. Dans votre premier cas, cela fonctionne parce que vous utilisez celui-ci:

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

Mais le second cas, vous utilisez celui-ci, en essayant de mettre une chaîne dans le paramètre object routeValues:

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

Enfin, la déclaration que vous souhaitez utiliser est:

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

mis en œuvre avec une valeur null, comme:

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

Et la raison ?length="9" est parce que « candidat » contient 9 caractères et la longueur est la seule propriété de chaîne

+2

Et la raison de '? Longueur = « 9 »' est parce que « candidat » contient 9 caractères et 'length' est la seule propriété de' string' –

+0

Merci pour la réponse! Maintenant, cela a du sens. :) Juste une chose de ce que j'ai vu la deuxième méthode est probablement Ajax.BeginForm (string actionName, string Controller, objet routeValues, options AjaxOptions, objet htmlAttributes) non? Pour la clarification de la réponse. Merci encore. –