2009-05-04 12 views
0

Beim Erstellen einer neuen Ansicht und Auswählen von Vorlage bearbeiten erstellt die Vorlage ein Textfeld für den Primärschlüssel, der nicht bearbeitet werden kann.ASP.Net MVC Einfach Daten aus Standardvorlage bearbeiten

<%=Html.TextBox("CompanyID", Model.CompanyID)%> 

Also, um die Steuerung von Sicht zu löschen, wird das Problem verursachen: die Sammlung, die Post-Controller hat die CompanyID = 0, so wird kein bearbeiten erfolgen. Aber wenn ich diese Codezeile zur Ansicht zurück lege, hat die CompanyID in der gebuchten Sammlung den richtigen Wert. Ich mache viel wie dieses Tutorial: http://www.asp.net/learn/mvc/tutorial-21-vb.aspx, und dort (graue Box über "Listing 6 - Controllers \ HomeController.vb (Methoden bearbeiten)" Abschnitt) es heißt, Sie können das Steuerelement löschen, aber es funktioniert nicht .. irgendeinen Rat ?

Aktualisiert Ok, für mehr erklären, geht hier 2 Probleme:
Problem 1 in diesem Code:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal movieToEdit As Movie) As ActionResult 

, wenn Sie die MovieID Textbox aus Sicht entfernen die MovieID in movietoedit Sammlung ist immer Null, so dass das tutorial von der asp.net-Website wird nicht funktionieren! wenn ich die MovieID aus Sicht löschen will, ich habe die ID an meinen Controller so passieren:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal ID as integer,ByVal movieToEdit As Movie) As ActionResult 

jetzt kann ich abfragen Modell dieser ID verwenden .. das ist kein Problem, aber es dauert mir einige Male herauszufinden, wie ich Schritt für Schritt von der Website gemacht habe!

Problem 2 Also, wie zu tun, ohne die MovieID in Sicht zu verwenden, auch in versteckten Textbox?
Ich benutze dies als meinen Controller: (mit Enity Rahmen)

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal id As Integer, ByVal collection As Company) As ActionResult 
    If Not ModelState.IsValid Then 
     Return View() 
    End If 

    Try 
     Dim c = _db.CompanySet.FirstOrDefault(Function(m) m.CompanyID = id) 

     If c Is Nothing Then 
      Return RedirectToAction("index") 
     End If 



     _db.ApplyPropertyChanges(c.EntityKey.EntitySetName, collection) 
     _db.SaveChanges() 

     Return RedirectToAction("Index") 
    Catch ex As Exception 
     Throw ex 
    End Try 
End Function 

Und wenn ich CompanyID aus meiner Sicht (Textbox oder verstecktes Feld) zu entfernen wird es mir aus c.EntityKey.EntitySetName diesem Fehler geben:
Der ObjectStateManager enthält keinen ObjectStateEntry mit einem Verweis auf ein Objekt vom Typ 'Companies.Company'.
und wenn ich so etwas wie

<%= Html.TextBox("CompanyName", Model.CompanyName) %> 

hinzufügen wird es funktionieren .. Ich bin verwirrt!

Anmerkung: Ich überprüfte den Code mehr als 10 Mal, und ich frage mich, ob alles da ist, ich falsch mache oder das Tutorial ist falsch ..

Antwort

0

Wenn Sie die ID sind vorbei und bestimmte Felder durch Updates aktualisieren, es sollte funktionieren. Sie sollten Ihre Edit-Methode besser posten, damit wir sehen können, was vor sich geht. Das folgende Beispiel veranschaulicht den Prozess, den ich zu erklären versucht habe.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Page page = repo.GetPage(id); // returns page with specific id 
    UpdateModel(page); // updates page with new form values 
    repo.Save(); // saving all the changes 
    return RedirectToAction("Details", new { id = page.id }); 

} 
+0

siehe bitte Frage, es wird aktualisiert – mohamadreza

2

Das Tutorial ist richtig, sollten Sie eine Textbox mit der ID nicht verlassen, ich glaube, sie die ID gehen davon aus Teil Ihrer Route, wie/Filme/edit/1 ist. Wenn dies nicht der Fall ist, können Sie es mithilfe der Routensammlung zur Formularaktion hinzufügen oder ein verstecktes Feld im Formular hinzufügen.

Hinzufügen der ID auf die Route der Bearbeitungsaktion:

<% using (Html.BeginForm("Edit", "Controller", 
       new {id = Model.Id}, FormMethod.Post)) 
    { %> 

oder ein verstecktes Feld:

<%=Html.Hidden("CompanyID", Model.CompanyID)%> 
+0

in meinem Fall gibt es keine Notwendigkeit für html.beginform Werte, denn es ist wie folgt:

bereits, und ich Ich möchte keine versteckten Felder verwenden. Gibt es eine Möglichkeit? – mohamadreza

0

auf diese Weise versuchen:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(<Bind(Exclude:="Id")> ByVal movieToEdit As Movie) As ActionResult 

Weitere Informationen zu ASP .Net MVC, siehe http://asp.net/learn/mvc