2009-09-22 2 views
1

Любые идеи, почему это не обновляется, но не выдает ошибку?ASP.NET MVC Updatemodel не обновляет, но не бросает ошибку

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

Не знаю, почему он не бросает ошибку не видя определение вашей модели объекта и набор ключей от FormCollection. Если вы переписываете его так, чтобы он использовал TryUpdateModel(), он возвращает false? does ModelState.IsValid() возвращает false? –

+0

Вы используете соглашение, чтобы вступать в брак с именами полей на своей веб-странице с именами полей в вашей модели. Чтобы диагностировать, нам нужно было бы увидеть оба. –

+0

Я также заметил, что страница редактирования даже не проверяет правильность после добавления метода .IsValid (который возвращает true). Он просто продолжается, как и данные в порядке и до сих пор не обновляется. общественного отдела Listone (интермедиат идентификатор) { вар = отдел из г в _dataContext.depts , где d.deptid == Идентификатор выберите д; отдел возврата. SingleOrDefault(); } – 2009-09-22 18:25:33

ответ

5

Иногда то, что может произойти ошибка брошена где-то внутри сборки MVC, который не обрабатывается хорошо, и который не копируется в вашу модель государства, как и ожидалось. Затем, когда вы пытаетесь отобразить в своем представлении Html.ValidationSummary, он не показывает вам ошибку, которая может быть очень запутанной. Один пример, который может привести к сбою процесса привязки этой модели, я написал около here. Обычно, выяснив, почему это происходит, вы можете внести исправления в свой код и больше не беспокоиться об этом.

У меня есть следующий код, который я использую для проверки во время отладки, чтобы позволить мне парить над ним в контрольной точке и посмотреть, что происходит на самом деле:

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; 
} 

Затем я могу вставить это после того, как я пытаюсь к UpdateModel, и установить точку останова на нем:

var x = ViewData.GetModelStateErrors(); 

Поместите это право после того, как ваш призыв к UpdateModel. Наведение на x покажет вам любые необработанные исключения в процессе привязки к модели, если это то, что действительно является проблемой здесь.

Удачи вам!

+0

P.S., это также невероятно удобно, когда все, что вы получаете в своем «ValidationSummary», является страшным «Требуется значение». (т. е. нет ключа или имени поля, чтобы помочь вам точно определить _what_ это то, что требуется ...) – Funka

+0

Я получаю этот тип/пространство имен viewdatadictionary не удалось найти. Кроме того, где, черт возьми, вы помещаете этот блок кода? Я не привык ко всему этому MVC – 2009-09-23 12:37:18

+0

TryUpdateModel возвращает true, но не обновляет – 2009-09-23 13:09:37

1

При использовании Linq к Sql для классов модели, если вы обновляете против таблицы, которая не имеет первичного ключа, то вызывая updateModel() метод не будет обновлять данные и не будет давать какие-либо ошибки: либо , Решение в таком случае состоит в использовании методов ExecuteCommand или ExecuteQuery с объектом вашего класса DataContext.

например:

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

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