Html.DisplayFor и Html.EditorFor отображают разные значения - PullRequest
3 голосов
/ 03 февраля 2012

Я полностью в замешательстве.
Я выполняю поисковую форму в MVC2 (я сделал еще дюжину других для этого проекта, все работает нормально.)
У Global.asax есть этоroute:

  routes.MapRoute("OnlineHelpSearchIndex",
                          "Help/Search/{expression}/{page}",
                          new { controller = "OnlineHelp", action = "Search", expression = UrlParameter.Optional, page=1 });

Выражение представляет собой строку в кодировке base64.Я декодирую его в контроллере, передаю его модели, обладающей свойством Expression, и отображаю ее в PartialView в TextBox.(Затем, когда пользователь щелкает ссылку или нажимает клавишу ввода, я кодирую строку в javascript и отправляю ее на "/Help/Search/"+value)

У меня есть несколько поисковых систем, построенных таким образом (каждое с маршрутом SomeModule/Search/{expression}), иодин из них не работает.

<%:Html.DisplayFor(m => m.Expression)%>
<%: Model.Expression %>
<%:Html.TextAreaFor(m => m.Expression)%>
<%:Html.TextBoxFor(m => m.Expression)%>
<%:Html.EditorFor(m => m.Expression)%>

Первые два отображают правильное выражение, остальные три отображают выражение в URL.
Я пытался жестко закодировать строку вмодель, первые две отображали жестко закодированную строку, остальные три отображали то, что было в URL. Как это возможно?
(я даже пытался с отключенным JS, так что это проблема на стороне сервера)

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Попробуйте изменить имя параметра expression как в routes.MapRoute, так и в вашем OnlineHelp/Search контроллере / методе действия:

routes.MapRoute("OnlineHelpSearchIndex",
                          "Help/Search/{exprs}/{page}",
                          new { controller = "OnlineHelp", action = "Search", exprs = UrlParameter.Optional, page=1 });

(или, есливы можете изменить имя свойства Expression вашей модели).

Это часто происходит при работе с полями формы, созданными HtmlHelper методами, такими как TextBoxFor /EditorFor, когда ViewModel имеет одно или несколько свойств, которые имеют одно и то же имя параметра Router/Controller: вы можете легко проверить это, взглянув на сгенерированный HTML-код, поля типа ввода, созданные методами HtmlHelperскорее всего, будет иметь атрибут id='Expression', который вызывает всю проблему.

0 голосов
/ 08 ноября 2017

Я знаю, что это старая ветка, но я решила, что все равно отвечу.Причина, по которой это происходит, является намеренной, это связано с ModelState.См. Этот вопрос для другого случая: Asp.net MVC ModelState.Clear

Короче говоря, вы отправляете данные формы в контроллер и возвращаете представление и используете помощники.Поэтому MVC предполагает, что это ошибка проверки, и возвращает значение ModelState, а не значение данных вашей модели.Первые два отображаются правильно, потому что они не редакторы, остальные 3 - редакторы, поэтому они показывают ModelState.

Либо вызовите ModelState.Clear () в контроллере, чтобы сдуть его, либо реализуйте другой дизайншаблон, такой как POST, Redirect, GET.

...