web-dev-qa-db-ger.com

Das Asp.net-Kernmodell bindet nicht vom Formular

Ich fange Post-Requests von der 3rd-Side-Static-Seite (generiert von Adobe Muse) ab und handle mit MVC-Aktion.

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

Routing für leere Formularaktion:

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

Aber bei entsprechender Aktion habe ich Modell mit jeder Eigenschaft ist leer

Aktion:

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

Modell:

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 enthält alle Werte aus form, das Modell ist jedoch leer

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

Achten Sie darauf, dass Sie einem Aktionsparameter keinen Namen geben, der mit einer Modelleigenschaft identisch ist. Andernfalls versucht der Binder, an den Parameter zu binden, und schlägt fehl.

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

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

Ändern Sie den Aktionsparameter 'email' in einen anderen Namen und er wird wie erwartet gebunden.

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

Ich bin nicht sicher, ob es sich um den gleichen Fall handelt, aber ich hatte das gleiche Problem und nichts scheint für mich zu arbeiten.
Das Problem in meinem Fall war, dass ich eine Eigenschaft namens Modell in meiner Ansichtsmodellklasse hatte

public string Model { get; set; }

Als ich die Eigenschaft in ModelName umbenannte, funktionierte alles wieder einwandfrei, auch ohne FromForm-Attribut.

Sieht aus, als könnten einige spezielle Eigenschaftsnamen für die asp.net mvc-Modellbindung ein Problem sein.

Ich empfehle Ihnen daher, Ihre Modelleigenschaften zu überprüfen und möglicherweise nacheinander umzubenennen, um zu überprüfen, ob das Problem vorliegt. 

Hoffe das hilft.

1
Velyo

Ich habe das gleiche Problem. Diese Dokumente helfen mir, Model Binding zu verstehen https://docs.asp.net/de/latest/mvc/models/model-binding.html

Ich löste mein Problem, indem ich sicherstellte, dass der Eigenschaftsname im Formularfeldnamen .__ genau übereinstimmt. Außerdem füge ich das Attribut [FromForm] hinzu, um die Bindungsquelle genau anzugeben.

0
phen

Dieses Problem kann auch auftreten, wenn eine oder mehrere Ihrer Eigenschaften im Anforderungsmodell nicht an ein akzeptierbares Anforderungsmodell gebunden werden.

In meinem Fall sollte ich einen List<string>-Typ an eine Eigenschaft übergeben, aber aus Versehen einen string übergeben. Dies führte dazu, dass das gesamte Anforderungsmodell zu null wurde.

0
daniel.caspers

Ich bin heute darauf gestoßen, und obwohl dies im Nachhinein offensichtlich erscheint, möchte ich hinzufügen, dass Sie sicherstellen müssen, dass Ihre Zugriffsmodifikatoren für die Eigenschaften des Modells, das Sie binden, korrekt sind. Ich hatte public MyProperty { get; internal set; } auf einige und sie würden nicht binden. internal wurde entfernt und sie funktionierten einwandfrei.

0
Mikah Barnett

Ändern Sie void in ActionResult

[HttpPost]
public ActionResult Index(EmailModel email)

Vergessen Sie nicht, AntiForgeryToken anhand Ihrer Ansicht und Ihrer Tätigkeit zu überprüfen. 

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

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

In meinem Fall habe ich die MVC 4.0-Konvention zum Benennen des Objekts verwendet, das Sie veröffentlichen. Z.B.,

js: $http.post("SaveAnswer", { answer: answerValues })

C #: public ActionResult SaveAnswer([FromBody] AnswerVM answer) {...}

Als ich das js auf $http.post("SaveAnswer", answerValues) änderte, funktionierte alles.

0
Daniel