web-dev-qa-db-fra.com

Soumission de formulaire et transmission de données à une méthode de contrôleur de type FileStreamResult

J'ai un formulaire MVC (fabriqué à partir d'un modèle) qui, une fois soumis, je souhaite obtenir un paramètre. J'ai le code pour définir le formulaire et obtenir le paramètre.

using (@Html.BeginForm("myMethod", "Home", FormMethod.Get, new { id = @item.JobId })){
}

et à l'intérieur de mon contrôleur à la maison, j'ai

    [HttpPost]
    public FileStreamResult myMethod(string id)
    {
         sting str = id;

    }

Cependant, j'ai toujours l'erreur

La ressource que vous recherchez (ou l’une de ses dépendances) a peut-être été supprimée, si son nom a été modifié ou est temporairement indisponible. Veuillez réviser l'URL suivante et assurez-vous qu'elle est orthographiée correctement.

Quand j'omets le [HttpPost], le code est exécuté, mais les variables str et id sont nulles. Comment puis-je résoudre ce problème s'il vous plaît?

MODIFIER

Cela peut-il être dû au fait que myMethod dans le contrôleur n'est pas un ActionResult? Je me suis rendu compte que lorsque j'ai une méthode de type Actionresult où la méthode est liée à une vue, tout fonctionne bien. Mais le type FileStreamresult ne peut pas être lié à une vue. Comment puis-je transmettre des données à de telles méthodes?

33
jpo

En cas de doute, suivez les conventions MVC.

Créez un viewModel si vous ne possédez pas déjà une propriété pour JobID

public class Model
{
     public string JobId {get; set;}
     public IEnumerable<MyCurrentModel> myCurrentModel { get; set; }
     //...any other properties you may need
}

Tapez fortement votre vue

@model Fully.Qualified.Path.To.Model

Ajouter un champ masqué pour JobId au formulaire

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post))
{   
    //...    
    @Html.HiddenFor(m => m.JobId)
}

Et acceptez le modèle en tant que paramètre dans votre action de contrôleur:

[HttpPost]
public FileStreamResult myMethod(Model model)
{
    sting str = model.JobId;
}
50
Forty-Two

En effet, vous avez spécifié la méthode de formulaire sous la forme GET

Changez le code dans la vue en ceci:

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){
}
14
CoffeeCode

Vous semblez spécifier que le formulaire utilise une requête HTTP 'GET' en utilisant FormMethod.Get. Cela ne fonctionnera que si vous lui demandez de publier un message, car c'est ce que vous semblez vouloir faire avec ActionResult. Cela fonctionnera probablement en changeant FormMethod.Get à FormMethod.Post.

En plus de cela, vous voudrez peut-être aussi réfléchir au fonctionnement des demandes d’obtention et de publication et à leur interaction avec le modèle.

3
Alex

ici, le problème est la liaison de modèle si vous spécifiez une classe, alors la liaison de modèle peut la comprendre lors de la publication si elle est un entier ou une chaîne, puis vous devez spécifier le [FromBody] pour la lier correctement.

apportez les modifications suivantes dans FormMethod

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){

}

et à l'intérieur de votre contrôleur domestique pour lier la chaîne, vous devez spécifier [FromBody]

using System.Web.Http;
[HttpPost]
public FileStreamResult myMethod([FromBody]string id)
{
     // Set a local variable with the incoming data
     string str = id;

}

FromBody est disponible dans System.Web.Http. assurez-vous que vous avez la référence à cette classe et l'ajoutée dans le fichier cs.

3
Anto Subash