2009-09-22 9 views
1

Des idées pour lesquelles cela ne met pas à jour mais ne renvoie pas une erreur?ASP.NET MVC Updatemodel ne pas mettre à jour mais ne pas lancer l'erreur

public ActionResult Edit(int id, [Bind(Exclude = "deptid")]FormCollection collection) 
    { 
     var department = _repository.ListOne(id); //Grabs record from linq to sql 
     try 
     { 
      UpdateModel(department); 
      _entities.SubmitChanges(); 

      // TODO: Add update logic here 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(department); 
     } 
    } 
+0

Je ne sais pas pourquoi il ne jette pas l'erreur sans voir réellement votre définition de l'objet modèle et clé de la FormCollection. Si vous le réécrivez pour qu'il utilise TryUpdateModel(), renvoie-t-il false? Est-ce que ModelState.IsValid() renvoie false? –

+0

Vous utilisez convention pour marier les noms de champ dans votre page Web avec les noms de champ dans votre modèle. Pour diagnostiquer, nous aurions besoin de voir les deux. –

+0

J'ai également remarqué que la page d'édition ne valide même pas correctement après avoir ajouté la méthode .IsValid (qui renvoie true). Cela continue comme si les données étaient correctes et ne se mettaient toujours pas à jour. dept publique LISTONE (int id) { département var = de d dans _dataContext.depts où d.deptid == id select d; return department.SingleOrDefault(); } –

Répondre

5

Parfois, ce qui peut arriver est une erreur est renvoyée quelque part à l'intérieur de l'assemblage MVC qui n'est pas géré bien, et qui ne sont pas copiés dans votre état de modèle comme prévu. Ensuite, lorsque vous essayez d'afficher dans votre vue le Html.ValidationSummary, il ne vous montre pas l'erreur, ce qui peut être très confus. Un exemple qui peut planter ce processus de liaison de modèle que j'ai écrit sur here. Habituellement, après avoir compris pourquoi cela se produit, vous pouvez apporter les corrections à votre code et ne plus vous en soucier.

J'ai le code suivant que j'utiliser pour inspecter pendant le débogage, de me laisser survolez à un point d'arrêt et voir ce qui se passe réellement:

public static IDictionary<string, string> GetModelStateErrors(this ViewDataDictionary viewDataDictionary) 
{ 
    Dictionary<string, string> dict = new Dictionary<string, string>(); 
    foreach (var modelStateKey in viewDataDictionary.ModelState.Keys) 
    { 
     var modelStateValue = viewDataDictionary.ModelState[modelStateKey]; 
     foreach (var error in modelStateValue.Errors) 
     { 
      var errorMessage = error.ErrorMessage; 
      var exception = error.Exception; 
      if (!String.IsNullOrEmpty(errorMessage)) 
      { 
       dict.Add(modelStateKey, "Egads! A Model Error Message! " + errorMessage); 
      } 
      if (exception != null) 
      { 
       dict.Add(modelStateKey, "Egads! A Model Error Exception! " + exception.ToString()); 
      } 
     } 
    } 
    return dict; 
} 

Ensuite, je peux insérer ce après que j'essaie à UpdateModel, et mettre un point d'arrêt sur elle:

var x = ViewData.GetModelStateErrors(); 

Mettez ce juste après l'appel à UpdateModel. Passer la souris sur le x vous montrera toutes les exceptions non gérées dans le processus de liaison de modèle, si c'est ce qui est vraiment le problème ici.

Bonne chance!

+0

P.S., c'est aussi incroyablement pratique pour quand tout ce que vous obtenez dans votre 'ValidationSummary' est le redouté" Une valeur est requise. " (c'est-à-dire, pas de clé ou nom de champ pour vous aider à comprendre exactement _what_ c'est ce qui est nécessaire ...) – Funka

+0

Je reçois un ce type/namespace viewdatadictionary n'a pas pu être trouvé. Aussi, où diable mettez-vous ce bloc de code? Je ne suis pas habitué à toute cette affaire MVC –

+0

TryUpdateModel renvoie vrai mais ne met pas à jour –

1

Lors de l'utilisation LINQ to SQL pour les classes Model, Si vous mettez à jour sur une table qui ne dispose pas d'une clé primaire , puis en appelant la méthode updateModel() mettra pas à jour les données et ne donnera aucune erreur ou l'autre . Dans ce cas, la solution consiste à utiliser les méthodes ExecuteCommand ou ExecuteQuery avec l'objet de votre classe DataContext.

ex:

MyDataContext db= new MyDataContext(); 
string name="test"; 
int roll=123; 

string UpdateStatement="Update table xyz set name='+ name+"' where roll="+ roll; 
db.ExecuteCommand(UpdateStatement);