web-dev-qa-db-fra.com

Le modèle de base Asp.net ne lie pas à partir de la forme

J'attrape la requête post de la page statique 3e côté (générée par Adobe Muse) et la gère avec l'action MVC.

<form method="post" enctype="multipart/form-data">
   <input type="text" name="Name">
   ...
</form>

Routage pour une action de formulaire vide:

app.UseMvc(routes => routes.MapRoute(
   name: "default",
   template: "{controller=Home}/{action=Index}"));

Mais selon l'action j'ai modèle avec chaque propriété est vide

Action:

[HttpPost]
public void Index(EmailModel email)
{
   Debug.WriteLine("Sending email");
}

Modèle:

public class EmailModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Company { get; set; }
    public string Phone { get; set; }
    public string Additional { get; set; }
}

Request.Form a toutes les valeurs du formulaire, mais le modèle est vide

[0] {[Name, Example]}
[1] {[Email, [email protected]]}
[2] {[Company, Hello]}
[3] {[Phone, Hello]}
[4] {[Additional, Hello]}
13
Kovpaev Alexey

Veillez à ne pas attribuer à un paramètre d'action un nom identique à celui d'une propriété de modèle, sinon le classeur tentera de se lier au paramètre et échouera.

public async Task<IActionResult> Index( EmailModel email ){ ... }

public class EmailModel{ public string Email { get; set; } }

Changez le paramètre actions 'email' avec un nom différent et il se liera comme prévu.

public async Task<IActionResult> Index( EmailModel uniqueName ){ ... }
31
Stuart

Je ne suis pas sûr que ce soit la même chose, mais j'ai eu le même problème et rien ne semble vraiment fonctionner pour moi.
Le problème dans mon cas était que j'avais une propriété appelée Model dans ma classe de modèles de vues

public string Model { get; set; }

Lorsque j'ai renommé la propriété en ModelName, tout fonctionnait à nouveau correctement, même sans l'attribut FromForm.

Certains noms de propriété spéciaux pourraient poser un problème pour la liaison de modèle asp.net mvc.

Mon conseil est donc de vérifier les propriétés de votre modèle et peut-être d'essayer de les renommer un par un afin de vérifier si le problème existe. 

J'espère que cela t'aides.

1
Velyo

J'ai le même problème Cette documentation m'aide à comprendre la liaison de modèle https://docs.asp.net/en/latest/mvc/models/model-binding.html

J'ai résolu mon problème en m'assurant que le nom de la propriété correspond exactement au nom du champ de formulaire .__ et j'ai également ajouté l'attribut [FromForm] pour spécifier exactement la source de liaison.

0
phen

Ce problème peut également se produire si une ou plusieurs de vos propriétés du modèle de demande ne parviennent pas à se lier à un modèle acceptable sur le modèle de demande.

Dans mon cas, je devais passer un type List<string> à une propriété, mais j'ai accidentellement passé une string. Cela a eu pour résultat que le modèle de requête entier est devenu null

0
daniel.caspers

Remplacez void en ActionResult

[HttpPost]
public ActionResult Index(EmailModel email)

Et n'oubliez pas de vérifier AntiForgeryToken de votre vue et de votre action. 

// to your form in view 
@Html.AntiForgeryToken()
// ------------

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(EmailModel email)
0
agenc