4

У меня есть маршрут, как это:Id Route переопределяет Model.Id

Conference/Committees/1 

И внутри этой страницы, она перебирает комитетов для конференции (где Id конференции = 1).

У меня есть частичный вид, который отображает страницу редактирования стиля для выбранного комитета, с маршрутом, как это:

Conference/Committees/1?committeeId=2 

В отладки, данные модели является правильным, и Комитет имеет Id = 2 . Однако, когда я использую следующее заявление: Razor

@Html.HiddenFor(model => model.Id) 

со следующей моделью:

@model munhq.Models.Committee 

Скрытый ввод имеет значение «1» вместо «2».

Это ошибка в MVC? Или я делаю что-то неправильно?

Update

Если я заменяю

@Html.HiddenFor(model => model.Id) 

с

<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="@Model.Id" /> 

это делает правильное значение Id.

Update 2

public async Task<ActionResult> Committees(int id, PrivilegedAction? actionToTake, int? committeeId, ConferenceStatusMessage? csm) 
    { 
     Conference conference; 
     HandleConferenceStatusMessage(csm); 

     try 
     { 
      conference = await db.Conferences 
      .Include(i => i.Committees.Select(c => c.CommitteeMemberCommitteeEntries)) 
      .Where(i => i.Id == id) 
      .SingleAsync(); 

      HandleAction(actionToTake, conference); 
      HandleAuthorisations(conference); 
     } 
     catch 
     { 
      return ConferenceActionFail(); 
     } 

     if (committeeId == null) 
     { 
      if (conference.Committees.FirstOrDefault() == null) 
      { 
       committeeId = 0; 
      } 
      else 
      { 
       committeeId = conference.Committees.FirstOrDefault().Id; 
      } 

      ViewBag.ConferenceId = id; // used for adding a committee member entry 

      return RedirectToAction("Committees", new { id = id, action = actionToTake, committeeId = committeeId, csm = csm }); 
     } 
     else 
     { 
      if (CommitteeIsPartOfConference(conference, committeeId) || committeeId == 0) 
      { 
       ViewBag.SelectedCommittee = committeeId; 
       ViewBag.JsonAvailableMembers = jsonAvailableCommitteeMembers(id); 

       return View(conference); 
      } 
      else 
      { 
       return HttpNotFound(); 
      } 
     } 
    } 
+0

показать свой код контроллера. я уверен, что модель, которую вы передали в представление, имеет id = 2 –

+0

@KundanSinghChouhan см. обновление. Вам все еще нужно видеть код контроллера? –

+1

@nolly, представление не сообщает, что вы передали ему, это зависит от вашего кода контроллера, который содержит данные, переданные объектом. –

ответ

7

Попробуйте использовать это перед возвращением вид:

ModelState.Clear(); 

В общем, когда Action вызывается каркас создает ModelStateCollection на основе запросов строковых значений, пост-данные, значения маршрутизации и т. д. И этот ModelStateCollection будет передан в View. Все входные помощники HTML пытаются сначала получить значения из ModelStateCollection, прежде чем пытаться получить значения из фактической модели. И вот почему ваше расширение Html.HiddenFor работает некорректно (сначала оно проверяет ModelStateCollection), тогда как ваш <input type="hidden"> содержит правильное значение.

+1

Это такая важная функция. Жаль, что это не более очевидно. –

+0

При переопределении метода 'CreateController'' DefaultControllerFactory' после вызова 'base.CreateController (x, y)', это делает мой идентификатор модели установлен равным нулю. Выше решение работало, чтобы избавиться от этой проблемы. – Zeeshan

+1

Имейте в виду, что с помощью этого метода вы также очищаете ошибки проверки модели, и поэтому любая проверка только на стороне сервера не будет отображаться в визуализированном представлении. –

Смежные вопросы