2009-05-04 9 views
0

lors de la création d'une nouvelle vue et en sélectionnant Modifier le modèle, le modèle crée une zone de texte pour la clé primaire qui n'est pas modifiable.ASP.Net MVC Simple Modifier les données du modèle par défaut

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

Ainsi, la suppression du contrôle de la vue, provoquera le problème: la collection qui est la poste à contrôleur a la CompanyID = 0, donc pas modifier sera fait. Mais si je remets cette ligne de code à afficher, le CompanyID dans la collection affichée a la bonne valeur. Je fais beaucoup comme ce tutoriel: http://www.asp.net/learn/mvc/tutorial-21-vb.aspx, et là (boîte grise au-dessus de la "Liste 6 - Contrôleurs \ HomeController.vb (Modifier les méthodes)" section), il est dit que vous pouvez supprimer le contrôle, mais son ne fonctionne pas. ?

Mise à jour Ok, pour plus d'expliquer, va ici 2 problèmes:
problème 1 dans ce code:

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

si vous supprimez la zone de texte MovieID de vue le MovieID dans movietoedit La collection est toujours nulle, donc le tutoriel du site asp.net ne fonctionnera pas! si je veux supprimer le MovieID de la vue, je dois passer l'ID à mon contrôleur comme ceci:

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

maintenant je peux interroger modèle en utilisant cet ID .. des thats pas de problème, mais il me faut un certain temps pour comprendre, comme je faisais pas à pas du site!

Problème 2 Alors, Comment faire pour éditer sans utiliser le movieID dans la vue, même dans la zone de texte cachée?
Je me sers de ce que mon contrôleur: (en utilisant le framework Enity)

<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 

Et si je retire de mon point de vue CompanyID (ou zone de texte champ caché), il me donnera cette erreur de c.EntityKey.EntitySetName:
ObjectStateManager ne contient pas ObjectStateEntry avec une référence à un objet de type "Companies.Company".
et si j'ajouter quelque chose comme

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

cela fonctionnera très bien .. Je suis confus!

Note: J'ai vérifié le code plus de 10 fois, et je me demande s'il y a quelque chose que je fais mal ou le tutoriel est faux ..

Répondre

0

Si vous passez les champs spécifiques id et la mise à jour par le biais UpdateModel, ça devrait marcher. Vous devriez mieux poster votre méthode d'édition pour nous laisser voir ce qui se passe. L'exemple suivant peut illustrer le processus que j'ai essayé d'expliquer.

[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

s'il vous plaît voir la question, il est mis à jour – mohamadreza

2

Le tutoriel est juste, vous ne devriez pas laisser une zone de texte avec l'id, je pense qu'ils sont en supposant l'ID fait partie de votre itinéraire, comme/films/modifier/1. Si ce n'est pas le cas, vous pouvez l'ajouter à l'action de formulaire en utilisant la collection de routes ou ajouter un champ masqué dans le formulaire.

Ajout de l'identifiant à la voie de l'action d'édition:

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

Ou un champ caché:

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

dans mon cas, il n'y a pas besoin de valeurs html.beginform, parce que c'est comme:

déjà, et je ne veut pas utiliser des champs cachés, y a-t-il un moyen? – mohamadreza

0

Essayez de cette façon:

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

Pour plus d'informations sur ASP .Net MVC, voir http://asp.net/learn/mvc

Questions connexes