2017-02-14 8 views
0

У меня есть веб-проект MVC 5.2.3.Почему Html.EditorFor()/Html.HiddenFor() неправильно отображает поле идентификатора?

У меня есть модель:

public class InstanceOnboarding : IInstanceOnboarding 
{ 
    public int ID { get; set; } 
    public int InstanceID { get; set; } 
    public string InstanceName { get; set; } 
    //etc... 
} 

И я отображая модель с Html.EditorFor так:

@Html.EditorFor(model => model, "InstanceOnboarding") 

В Views/Shared/EditorTemplates У меня есть файл InstanceOnboarding.cshtml что определяет, как должен отображаться файл EditorFor():

@model Models.InstanceOnboarding 

@Html.HiddenFor(model => model.ID) 
@Html.HiddenFor(model => model.InstanceID) 
@Html.HiddenFor(model => model.AuditFileID) 
//etc... 

Однако, если страница l ПССП и я осмотреть элемент в Chrome, я вижу это:

<input ... id="ID" name="ID" type="hidden" value="240"> 
<input ... id="InstanceID" name="InstanceID" type="hidden" value="240"> 

, даже если 240 является значением InstanceID, и 0, это значение ID. Я знаю, что это потому, что я вижу их в viewModel прямо перед загрузкой страницы. Без разницы!

Любая идея, как это происходит?

EDIT: Я экспериментировал с установкой идентификатора не равным 0; это не имеет значения.

EDIT 2: Показано метод контроллера по запросу: Controller method with inspecting the value (. Черные участки отредактированной информации)

+0

Вам нужно показать свой метод GET (я предполагаю, что у вас есть параметр с именем 'id', и тогда вы устанавливаете значение« InstanceID »на значение этого параметра) –

+0

Как примечание стороны, это должно быть' @ Html.EditorFor (model => model) 'и ваш' InstanceOnboarding.cshtml' EditorTemplate должен быть расположен в папке '/ Views/Shared/EditorTemplates' (или'/Views/YourControllerName/EditorTemplates' –

ответ

1

Проблема возникает потому, что ваш метод имеет параметр id. Если перейти к методу с использованием ../EditOnboarding/240, то DefaultModelBinder добавляет id: 240 к ModelState (я предполагаю, что ваш метод ShowitOnboarding() устанавливает значение InstanceID к значению id, но не устанавливает значение id).

всех HtmlHelper методы, которые генерируют элементы управления формы сначала проверьте значения в ModelState и если они существуют (в вашем случае делает для id), они используют это значение, а о том, что фактическая стоимость имущества (2-я часть this answer Объясняет поведение).

Один из способов решения этой проблемы - вызвать ModelState.Clear() перед возвратом вида (это приведет к удалению всех значений от ModelState, а затем методы HtmlHelper будут использовать значение свойства модели). Другой альтернативой является изменение параметра метода на int InstanceID (и добавление определенного определения маршрута для метода - это то, что вы хотите создать маршрут, а не строку запроса)

+0

Спасибо, это все. Все, что я сделал, это изменить параметр контроллера на другое имя ('InstanceID' вместо 'ID'), и это исправило это. Также хорошо знать, что есть фактическая причина, по которой он ведет себя таким образом. Хотелось бы, чтобы это было задокументировано. – levininja

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

  • Нет связанных вопросов^_^