Mon contrôleur POST n'est pas capable de capturer le paramètre ViewModel que j'ai défini et je suis très confus car j'ai un ensemble différent de contrôleur POST et il peut capturer le paramètre ViewModel.
Mon code ressemble à ceci,
Afficher la page
using MyProject.Web.Models;
using System.Collections.Generic;
namespace MyProject.Web.ViewModels
{
public class MyViewModel
{
public User UserInfo;
public List<Client> Clients;
public string Filter;
}
}
Contrôleur
using MyProject.Web.ViewModels;
[HttpGet]
[Route("Home/Index")]
public async Task<ActionResult> Index()
{
...await API integration code here...
return View(MyViewModel);
}
[HttpPost]
[Route("Home/Index/{viewmodel}")]
public ActionResult Index(MyViewModel viewmodel) <-- all properties of viewmodel are NULL
{
return View();
}
Afficher le modèle
@model MyProject.Web.ViewModels.MyViewModel
@{
ViewBag.Title = "Home";
ViewBag.Description = "My Project";
ViewBag.SubDescription = "My Project Tool";
Layout = null;
}
@using (Html.BeginForm())
{
@Html.TextBoxFor(m => m.Filter)
<input type="submit" class="btn btn-primary btn-inline-right input-tab" value="Search" />
}
3 Réponses :
utilisez ceci, je l'espère, utile:
@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))
Je l'ai essayé mais ça ne marche pas. Le résultat est le même qu'avant j'ai peur.
vous pouvez supprimer l'attribut Route, vérifiez ce lien, je l'espère utile: stackoverflow.com/questions/20333021/...
Le problème vient de l'itinéraire que vous avez défini en haut de votre action Post [Route ("Home / Index / {viewmodel}")] p >
Vous n'avez pas besoin de ce {viewmodel} dans cette URL car vous ne publiez rien dans la chaîne de requête, vous publiez un objet complexe dans le corps de votre message HTTP. >
Supprimez cette route et cela devrait fonctionner.
également, ASP.NET mvc mappe les entrées aux propriétés du modèle en fonction des attributs name sur eux comme mappera cette entrée à une propriété nommée abc sur un ViewModel ou juste un paramètre. Dans votre cas, @ Html.TextBoxFor (m => m.Filter) le fait automatiquement.
J'espère que cela vous aidera.
Passer de Public string Filter à la propriété Public string Filter {get; set;}
et changer la route en [Route ("Home / Index ")] au lieu de [Route (" Home / Index / {viewmodel} ")] .
J'ai testé et cela a fonctionné.
public class MyViewModel
{
public User UserInfo { get; set; }
public List<Client> Clients { get; set; }
public string Filter { get; set; }
}
[HttpPost]
[Route("Home/Index")]
public ActionResult Index(MyViewModel viewmodel)
{
return View();
}
Montrez-nous votre demande de message.
"Home / Index / {viewmodel}"semble une route un peu étrange carviewmodelest un objet complexe@Yan - Je l'exécute localement et le message n'est pas grand-chose. Mais les données du formulaire affichent Filter = testFilterValue . Pourriez-vous spécifier la partie spécifique que vous souhaitez voir?
@RistoM - que voulez-vous dire? Est-ce à cause de la liste?
@Lex pouvez-vous essayer de donner un nom à votre entrée qui correspond à votre propriété de modèle de vue nommée filtre comme
et voir si vous recevez une valeur dans la propriété de filtre de votre modèle de vue. et supprimez l'itinéraire du haut de votre action de publication@ZeeshanAdil - semble fonctionner, donc une bonne solution de contournement.
bon je suppose que le problème vient de votre itinéraire, pouvez-vous revenir à l'ancienne solution et supprimer simplement l'itinéraire?
@RistoM - vous avez peut-être raison. J'ai essayé de le simplifier en utilisant List of Client comme modèle dans View au lieu du modèle de vue complexe. Mais toujours désireux de trouver la bonne solution à ce sujet. Car avoir un modèle de vue qui contient toutes les informations nécessaires est beaucoup plus pratique - et propre .
@Lex regarde ma réponse pour comprendre ce qui se passe.
@ZeeshanAdil Les balises d'entrée se terminent automatiquement, donc
ne sera jamais valide.@TiesonT. Tu as raison, mon mal.