2017-01-29 4 views
-1

Ich studiere ASP.NET MVC 5. Ich erstellte eine Ansicht "Erstellen". Aber ich benutze nicht Razor, um die Eingabefelder zu erzeugen, ich benutze Eingänge mit reinem HTML.Gefüllte Felder nach HttpPost Create - Objekt ist Null mit Eingabe

Create.cshtml

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 

    Description: <br /> 
    <input type="text" name="Description" id="Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

Mein Controller:

public ActionResult Create() 
     {    
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Create(Product product) 
     { 
      if (ModelState.IsValid) 
      {     
       db.Product.Add(product);     
       db.SaveChanges();     
       return RedirectToAction("Index"); 

      } 
      else 
      { 
       return View(product); 
      } 

    It works fine. I can create new products. 

Aber ich brauche einige serverseitige Validierungen mit Anmerkungen im Modell zu verwenden. Also möchte ich die Daten senden und, wenn das Modell nicht gültig ist, gehe zurück zum Erstellen mit den Werten. Ich weiß, wie man die Validierungsnachrichten setzt. Also, ich habe es versucht:

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 

    Description: <br /> 
    <input type="text" name="Description" id="Description" value="@Model.Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

Wie binden Sie reine Eingabe mit HTML zu modellieren?

Warum Nullwert?

Vielen Dank.

+1

Warum in der Welt benutzen Sie nicht Rasiermesser? Erzeugen Sie Formularsteuerelemente korrekt mit '@ Html.LabelFor()', '@ Html.TextBoxFor()' und '@ Html.ValidationMessageFor()' - und sehen Sie sich dann das erzeugte HTML an und vergleichen Sie das mit Ihrem, was Sie bedeutet habe keine 2-Wege-Modellbindung und keine Validierung –

+0

Weil ich mit Front-End-Entwicklern arbeite, die mir den HTML-Code erstellen. Ich möchte wissen, ob es eine Möglichkeit gibt, mit dem Eingabetyp zu arbeiten. Wie man es bindet? – ComplexityAlg

+0

Mit den 'HtmlHelper'-Methoden erhalten Sie den korrekten HTML-Code, der für die Bindung und Validierung von 2-Wege-Modellen erforderlich ist. Und '@ Model.Description' ist Rasierklingencode, also gibt es keinen Grund zu sagen, dass Sie nicht Rasierer –

Antwort

0

Wenn Sie nicht razor based form approach verwenden möchten, können Sie die Anzeigevalidierungsnachricht mit Viewbag/ViewData verwenden.

[HttpPost] 
    public ActionResult Create(Product product) 
    { 
     if (!ModelState.IsValid) 
     { 
      //if you want to get validation message from ModelState itself, you can query from Modelstate : 
      string message = string.Join(" , ", ModelState.Values 
           .SelectMany(v => v.Errors) 
           .Select(e => e.ErrorMessage)); 
      ViewData["ValidationMessage"] = "Validation Message";// you can use above variable message here 
      return View(product); 
     } 
    // your other implementation 
    } 

Ihre Ansicht sollte wie folgt sein:

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 
    <div class="error-message">@ViewData["ValidationMessage"]</div> 
    Description: <br /> 
    <input type="text" name="Description" id="Description" value="@Model.Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

Aber ich würde empfehlen razor based form approach zu verwenden, wenn Sie berechtigt sind, dies zu tun.

+0

verwenden möchten Lösung ** ist ** mit Rasierer (das ist, was das' @ 'in' @ViewData ["ValidationMessage"] ' –

+0

yeah, aber OP benutzt bereits einige einfache Rasierer wie "@ Model.Description" und "@ Model.ValueType" –

+0

Ja, ich weiß (wie ich in den Kommentaren zu der Frage notiert habe). Aber Ihre Frage lautet _Wenn Sie nicht Ich will Rasierer verwenden, aber dann eine Lösung mit Rasiermesser zeigen :) –

0

Ich denke, dass Sie die Rasiereransicht Engine missverstehen können. Seiten 2.0 und 3.0 (Rasierer) hat keine Datenbindung in irgendeiner Weise. Es emuliert es mit den HTML-Helfern, aber das ist nicht native Rasierer Databinding. Werfen Sie einen Blick auf den Code hinter den Helfern (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Html/DefaultEditorTemplates.cs) und Sie werden sehen, dass sie nur die Arbeit ausführen, die Sie erhoffen.

Verwandte Themen