-1
votes

La valeur du modèle redirigée vers une autre action ne transmet pas toutes les valeurs

J'ai une application de base ASP.NET qui nécessite le passage d'un modèle d'une action à une autre.

Ce sont des modèles: xxx

et le contrôleur post: xxx

dans la TestAction 1 Tout en débogage, je vois que l'ID, le nom et les marques ont une valeur.

Je reçois la valeur pour ID dans Testace2 que dans Testage1. Cependant, la valeur des marques d'objet complexes n'est pas obtenue dans la méthode d'action TESTRACT22.

Quelles sont mes autres options?


11 commentaires

Peut-être essayer redirecttoaction ("Testager2", nouveau {modèle = modèle});


Il y a peut-être des pointeurs ici: Stackoverflow.com/Questtions/22505674/...


@Izzy j'ai essayé ça aussi, même résultat.


Qu'en est-il d'un simple Testace de retour2 (modèle) plutôt que d'un redirecttoaction . Vous pouvez également utiliser tempdata


Petit point, mais si votre classe de classe d'une classe n'a pas eu d'échantillons de dessinités de type «Studymarks». Sinon, alors quels sont les marques?


@ SR28 Ouais merci. J'essayais de reproduire une version simplifiée de ma classe et j'ai gâché.


Une redirection comme celle-là sera toujours une demande de choix; Pouvez-vous montrer l'URL complète que la redirection pointera-t-elle? Vous devriez être capable d'inspecter que via le navigateur.


Alors que le débogage, marques sont présents dans Testager1 avant redirecttoaction ?


@Gonzalolorieto Oui. C'est pourquoi je ne comprends pas pourquoi ça va null.


Jetez un coup d'œil ici, des problèmes liés à un modèle complexe: Github.com/aspnet/MVC/issues/5093


Découvrez @chris Pratt répondre


4 Réponses :


-1
votes

Je pense que le problème est que vous devez utiliser: xxx

(vous avez fait cela sans retour )


1 commentaires

Le compilateur ne montrerait-il pas une erreur si vous écrivez uniquement redirectToaction sans retour?



0
votes

Je pense que vous obtenez des modèles et des routres mélangés. La surcharge de la redirecture que vous appelez (prend une chaîne et un objet) attend un argument de routévalues, pas un argument de modèle. HTTPS: // docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase.redirectToaction?view=aspnetcore-2.2

Testager1 est appelé via Post, mais TestAction2 est appelée via GET. Vous devez travailler une URL qui vous permettra d'appeler TestAction2 comme vous le souhaitez (indépendamment de la redirection dans Testage1). Je suppose que cela impliquera la mise en place d'une route personnalisée. Une fois que vous avez une URL qui vous permettra d'appeler TestAction2 comme vous le souhaitez, vous pouvez spécifier les valeurs d'itinéraire pour former cette URL dans la redirection dans Testager1.


0 commentaires

2
votes

Vous ne pouvez pas rediriger avec un modèle. Une redirection est simplement une réponse vide avec un code d'état 301, 302 ou 307 et un en-tête Emplacement . Cet en-tête Emplacement contient l'URL que vous souhaitez rediriger le client.

Le client doit ensuite faire une nouvelle demande à cette URL dans l'en-tête, si elle choisit . Les navigateurs le feront automatiquement, mais tous les clients HTTP ne le seront pas. Il est important de noter que cette nouvelle demande est faite via un get et obtenir des demandes ne disposent pas de corps. (Techniquement, la spécification HTTP le permet, mais aucun navigateur ou client HTTP ne supporte réellement cela.)

On ne sait pas ce que votre objectif ultime est ici, mais si vous devez persister les données temporairement entre les demandes (telles qu'une redirection), vous devez ensuite sérialiser ces données dans une touche TEMPDATA .


0 commentaires

2
votes

Vous pouvez utiliser templdata ​​code> pour passer des données de modèle à une demande de redirection dans ASP.NET CORE CODE> dans ASP.NET CORE, vous ne pouvez pas passer des types complexes dans Templdata. Vous pouvez transmettre des types simples tels que String, INT, GUID, etc. Si vous souhaitez passer un objet de type complexe via templdata ​​code>, vous pouvez sérialiser votre objet à une chaîne et à passer cela. J'ai fabriqué une application de test simple qui suffira à vos besoins:

Contrôleur: P>

public class ClassA
{
    public ClassA()
    {
        Marks = new StudentMarks();
    }

    public string Id { get; set; }
    public string Name { get; set; }
    public StudentMarks Marks { get; set; }
}

public class StudentMarks
{
    public int Marks { get; set; }
    public string Grade { get; set; }
}


0 commentaires