2017-12-08 5 views
0

Entwicklung in: ASP.net Web Forms 4.5Wie funktioniert TryUpdateModel in asp.net?

ich derzeit hier das DynamicDataTemplateCS Nuget Paket wie im Tutorial mit: https://docs.microsoft.com/en-us/aspnet/web-forms/overview/presenting-and-managing-data/model-binding/updating-deleting-and-creating-data

Es ermöglicht die automatische Erzeugung updatemethod und deletemethods, wie ich sie verwenden und hatte kein Problem. Aber jetzt habe ich meine Daten ein wenig geändert, um die Informationen nicht aus der Tabelle auf ItemTemplate Feld von Gridview anzuzeigen.

Ich schaute auf den Code und in Print-Anweisungen und es scheint in TryUpdateModel-Methode gehen und gibt True, aber es aktualisiert die Datenbank nicht.

Der Code ist wie folgt aus: auf Ansicht:

<asp:GridView runat="server" ID="aGrid" CellPadding="10" 
    DataKeyNames="idx" AutoGenerateColumns="false" 
    selectMethod="aGrid_GetData" ItemType="model" 
    updateMethod="aGrid_UpdateItem" AutoGenerateEditButton="true" 
    deleteMethod="aGrid_DeleteItem" AutoGenerateDeleteButton="true" 
    onRowDataBound="aGrid_RowDataBound"> 
    <Columns> 
     <asp:DynamicField DataField="poNum" /> 
     <asp:BoundField DataField="a" HeaderText="a"/> 
     <asp:DynamicField DataField="someDate" DataFormatString="{0:d}" /> 
     <asp:BoundField HeaderText="b" /> 
     <asp:HyperLinkField HeaderText="c" NavigateUrl="~/yes?no={0}" /> 
     <asp:DynamicField DataField="e" /> 
     <asp:DynamicField DataField="f" /> 
     <asp:DynamicField DataField="g" DataformatString="{0:d}"/> 
     <asp:DynamicField DataField="h" /> 
    </Columns> 
</asp:GridView> 

Backend:

public void aGrid_UpdateItem(int idx) 
    { 
     using (Context db = new Context()) 
     { 
      model item = null; 
      item = db.model.Find(idx); 
      System.Diagnostics.Debug.WriteLine("updatemethod started"); 

      if (item == null) 
      { 
       // The item wasn't found 
       System.Diagnostics.Debug.WriteLine("item is null"); 

       ModelState.AddModelError("", String.Format("Item with id {0} was not found", idx)); 
       return; 
      } 
      System.Diagnostics.Debug.WriteLine("trying to update model"); 


      System.Diagnostics.Debug.WriteLine(TryUpdateModel(item)); 
      //TryUpdateModel(item); 
      if (ModelState.IsValid) 
      { 
       System.Diagnostics.Debug.WriteLine("before saving changes"); 
       db.SaveChanges(); 
       System.Diagnostics.Debug.WriteLine("after saving changes"); 
       // Save changes here, e.g. MyDataLayer.SaveChanges(); 
      } 
      else 
      { 
       System.Diagnostics.Debug.WriteLine("ModelState not valid!!"); 
      } 
     } 
    } 

ich kann nicht herausfinden, warum dies nicht aktualisiert .. Ich bezweifle, dass die beiden Boundfields "b" und "c", weil ihre Daten tatsächlich nicht aus dem Modell sind. Ich habe sie draußen gebunden. Trotzdem wäre es gut zu wissen, wie das TryUpdateModel funktioniert, damit ich herausfinden kann, warum das nicht funktioniert.

Übrigens ist dies der Code, den ich "b" und "c" -Feld gebunden habe. Als ich sie in der Ansicht auskommentierte, funktionierte das Update so, dass sie schuldig sind, dass TryUpdateModel nicht funktioniert.

protected void aGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     using (thisAction ta = new thisAction()) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 

       string str = e.Row.Cells[2].Text; 
       if (str.Length > 0) 
       { 
        string str2 = soa.get_str2(str); 
        e.Row.Cells[4].Text = str2; 

        string str3 = soa.get_str3(str); 
        e.Row.Cells[5].Text = str3; 
       } 

      } 
     } 
    } 

PS: Ich für die Namensgebung entschuldigen .. es hat einige sensible Daten, damit ich sie

+0

Es funktioniert wirklich, wenn ich diese zwei Felder verberge. "b" und "c" jetzt sind die Felder tatsächlich schuldig. –

Antwort

0

ich gepostet auf asp.net Forum und jemand antwortete ändern musste ... Die Besetzung dieser Stelle für die zukünftige Referenzen, aber der Dank geht an Cathy Zou. Danke Cathy.

Hallo jimmythegreat,

TryUpdateModel Die Methode wendet die Abgleichungsdaten gebundenen Werte aus dem Web-Formular zu dem Datenelement. Das Datenelement wird basierend auf dem Wert des ID-Parameters abgerufen.

Also, die datengebundenen sollte mit den in der Einheit (ItemType = „WingtipToys.Models.Student“) eingereichten Daten angepasst werden

Also, sollten Sie nicht Boundfields (b und c) haben, weil ihre Daten stammen nicht vom Modell;

Ich mache eine Arbeitsprobe basierend auf Tutorial zur Verfügung gestellt:

<asp:GridView runat="server" ID="studentsGrid" 
      ItemType="WingtipToys.Models.Student" DataKeyNames="StudentID" 
      SelectMethod="studentsGrid_GetData" 
      UpdateMethod="studentsGrid_UpdateItem1" 
DeleteMethod="studentsGrid_DeleteItem" 
      AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" 
      AutoGenerateColumns="false"> 
      <Columns> 
       <asp:DynamicField DataField="StudentID" /> 
       <asp:DynamicField DataField="LastName" /> 
       <asp:DynamicField DataField="FirstName" /> 
       <asp:DynamicField DataField="Year" /> 
       <asp:TemplateField HeaderText="Total Credits"> 
        <ItemTemplate> 
         <asp:Label Text="<%# Item.Enrollments.Sum(en => en.Course.Credits) %>" 
          runat="server" /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

Codebehind:

using WingtipToys.Models; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

    public IQueryable<Student> studentsGrid_GetData() 
     { 
     SchoolContext db = new SchoolContext(); 
     var query = db.Students.Include(s => s.Enrollments.Select(e => e.Course)); 
     return query; 
    } 
    public void studentsGrid_UpdateItem(int studentID) 
    { 
     using (SchoolContext db = new SchoolContext()) 
     { 
      Student item = null; 
      item = db.Students.Find(studentID); 
      if (item == null) 
      { 
       ModelState.AddModelError("", 
        String.Format("Item with id {0} was not found", studentID)); 
       return; 
      } 

      UpdateModel(item); 
      if (ModelState.IsValid) 
      { 
       db.SaveChanges(); 
      } 
     } 
    } 

    public void studentsGrid_DeleteItem(int studentID) 
    { 
     using (SchoolContext db = new SchoolContext()) 
     { 
      var item = new Student { StudentID = studentID }; 
      db.Entry(item).State = EntityState.Deleted; 
      try 
      { 
       db.SaveChanges(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       ModelState.AddModelError("", 
        String.Format("Item with id {0} no longer exists in the database.", studentID)); 
      } 
     } 
    } 

Mit freundlichen Grüßen

Cathy

Link: https://forums.asp.net/t/2133078.aspx?How+does+TryUpdateModel+work+

Verwandte Themen