ASP.NET Бета 1 MVC: DefaultModelBinder неправильно сохраняет параметр и состояние проверки между несвязанными запросами

Проверка источника (vte и gnome-терминал), похоже, что сделать это невозможно. Другие терминалы (например, xterm) могут делать это с помощью escape-последовательностей. См. Управляющие последовательности XTerm :

OSC Ps ; Pt ST
          Set Text Parameters.  For colors and font, if Pt is a "?", the
          control sequence elicits a response which consists of the con-
          trol sequence which would set the corresponding value.  The
          dtterm control sequences allow you to determine the icon name
          and window title.

  ...

            Ps = 5 0  -> Set Font to Pt.  These controls may be disabled
          using the allowFontOps resource.  If Pt begins with a "#",
          index in the font menu, relative (if the next character is a
          plus or minus sign) or absolute.  A number is expected but not
          required after the sign (the default is the current entry for
          relative, zero for absolute indexing).

vte распознает 50 , но это (как и многие другие функции xterm) это просто заглушка, которая ничего не делает. Источники xterm включают 20-летний сценарий , который демонстрирует эту особенность (см. fonts.sh ).

Вместо использования escape-последовательности вы можете использовать инструмент wmctrl (который может попросить оконного менеджера договориться с терминалом). Некоторые сделали это с другими терминалами, например, с терминологией (но в конечном итоге с помощью escape-последовательности).

vte имеет некоторый код, который может быть доступен из скрипта Python, используя g_signal_connect, чтобы связать сигнал decrease-font-size и increase-font-size (см. исходный код ). Сигнальный код - это то, что вы используете с клавиатурой. Но как вы можете определить указатель на объект из скрипта, запускаемого вне эмулятора терминала, не ясно.

6
задан Alex Scordellis 28 October 2008 в 08:21
поделиться

5 ответов

Оказывается, что проблема состояла в том, что мои контроллеры снова использовались между вызовами. Одна из деталей, которые я принял решение опустить из своего исходного сообщения, - то, что я использую Замок. Виндзорский контейнер для создания моих контроллеров. Мне не удалось отметить мой контроллер с Переходным образом жизни, таким образом, я возвращал тот же экземпляр по каждому запросу. Таким образом контекст, используемый редактором связей, снова использовался, и конечно он содержал устаревшие данные.

Я обнаружил проблему, тщательно анализируя различие между кодом Eilon и моим, устранив все другие возможности. Как в документации Замка говорится, это - "ужасная ошибка"! Позвольте этому быть предупреждением другим!

Спасибо за Ваш ответ Eilon - извините, что заняли Ваше время.

5
ответ дан 10 December 2019 в 02:55
поделиться

Я не уверен, связано ли это или нет, но Ваш вызов к <% = HTML. TextBox ("newRunTime. Время", ViewData. Модель. Время) %> мог бы на самом деле выбрать неправильную перегрузку (так как Время является целым числом, она выберет object htmlAttributes перегрузка, а не string value.

Проверка представленного HTML сообщит, происходит ли это. изменение интервала к ViewData.Model.Time.ToString() вызовет корректную перегрузку.

Это кажется, что Ваша проблема - что-то другое, но я заметил, что и были записаны в прошлом.

2
ответ дан 10 December 2019 в 02:55
поделиться

Я пытался воспроизвести эту проблему, но я не вижу того же самого поведения. Я создал почти точно тот же контроллер и представления, что Вы имеете (с некоторыми предположениями) и каждый раз, когда я создал новое "Время выполнения", я поместил его значение в TempData и отослал его посредством Перенаправления. Затем на целевой странице я захватил значение, и это всегда было значение, которое я ввел по тому запросу - никогда устаревшее значение.

Вот мой Контроллер:

общедоступный класс HomeController: Контроллер {общедоступный Индекс ActionResult () {ViewData ["Заголовок"] = "Домашняя страница"; представьте сообщение в виде строки = "Приветствие": + TempData ["сообщение"]; если (TempData. ContainsKey ("значение")) {интервал theValue = (международный) TempData ["значение"]; обменивайтесь сообщениями + = "" + theValue. ToString ();} ViewData ["сообщение"] = сообщение; возвратите Представление ();}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Create() {
    return View(RunTime.Default);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(RunTime newRunTime) {
    if (ModelState.IsValid) {
        //service.CreateNewRun(newRunTime);
        TempData["Message"] = "New run created";
        TempData["value"] = newRunTime.TheValue;
        return RedirectToAction("index");
    }
    return View(newRunTime);
}

}

И вот мое Представление (Create.aspx):

<% using (Html.BeginForm()) { %>
<%= Html.TextBox("newRunTime.TheValue", ViewData.Model.TheValue) %>
<input type="submit" value="Save" />
<% } %>

Кроме того, я не был уверен, на что был похож тип "Во время выполнения", таким образом, я сделал этого:

   public class RunTime {
        public static readonly RunTime Default = new RunTime(-1);

        public RunTime() {
        }

        public RunTime(int theValue) {
            TheValue = theValue;
        }

        public int TheValue {
            get;
            set;
        }
    }

Действительно ли возможно, что Ваша реализация RunTime включает некоторые статические значения или что-то?

Спасибо,

Eilon

2
ответ дан 10 December 2019 в 02:55
поделиться

Столкнувшись с подобными проблемами при попытке использовать контейнер МОК Виндзора в приложении MVC ASP.NET я должен был пройти то же путешествие исследования для получения его работа. Вот некоторые детали, которые могли бы помочь кому-то еще.

Используя это начальная настройка в Global.asax:

  if (_container == null) 
  {
    _container = new WindsorContainer("config/castle.config");
    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(Container)); 
  }

И использование WindsorControllerFactory, который при просьбе относительно экземпляра контроллера делает:

  return (IController)_container.Resolve(controllerType);

Пока Виндзор правильно соединял все контроллеры, по некоторым причинам параметры не передавались от формы до соответствующего действия контроллера. Вместо этого они были всем пустым указателем, хотя он называл корректное действие.

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

http://www.castleproject.org/monorail/documentation/trunk/integration/windsor.html

Однако документация действительно указывает, что образ жизни контроллеров может быть изменен на переходный процесс, хотя это на самом деле не говорит Вам, как сделать это, если Вы используете конфигурационный файл. Оказывается, что это достаточно легко:

<component 
  id="home.controller" 
  type="DoYourStuff.Controllers.HomeController, DoYourStuff" 
  lifestyle="transient" />

И без любых изменений кода это должно теперь работать как ожидалось (т.е. уникальные контроллеры каждый раз, обеспеченный одним экземпляром контейнера). Можно затем реализовать всю конфигурацию МОК в файле конфигурации, а не коде как хороший мальчик/девочка, что я знаю, что Вы.

0
ответ дан 10 December 2019 в 02:55
поделиться

Seb, я не уверен, что Вы подразумеваете под примером. Я ничего не знаю о конфигурации Единицы. Я объясню ситуацию с Замком. Виндзор и возможно который поможет Вам с настроить Единицу правильно.

По умолчанию, Замок. Виндзор возвращает тот же объект каждый раз, когда Вы запрашиваете данный тип. Это - одноэлементный образ жизни. Существует хорошее объяснение различных опций образа жизни в Замке. Виндзорская документация.

В ASP.NET MVC каждый экземпляр класса контроллера связывается с контекстом веб-запроса, которому он был создан для обслуживания. Таким образом, если Ваш контейнер МОК возвратит тот же экземпляр Вашего класса контроллера каждый раз, то когда Вы будете всегда связывать контроллер с контекстом первого веб-запроса, который использовал тот класс контроллера. В частности, ModelState и другие объекты, используемые DefaultModelBinder будет снова использован, таким образом, Ваш связанный объект модели и сообщения проверки в ModelState будет устаревшим.

Поэтому Вам нужен Ваш МОК для возврата нового экземпляра каждый раз, когда MVC запрашивает экземпляр класса контроллера.

В Замке. Виндзор, это называют переходным образом жизни. Для конфигурирования его у Вас есть две опции:

  1. Конфигурация XML: Вы добавляете образ жизни = "переходный процесс" к каждому элементу в Вашем конфигурационном файле, который представляет контроллер.
  2. Конфигурация в коде: можно сказать контейнеру использовать переходный образ жизни в то время, когда Вы регистрируете контроллер. Это - то, что помощник MvcContrib, которого упомянутый Ben делает автоматически для Вас - смотрит на метод RegisterControllers в исходном коде MvcContrib.

Я предположил бы, что Единица предлагает подобное понятие образу жизни в Замке. Виндзор, таким образом, необходимо будет настроить Единицу для использования ее эквивалента переходного образа жизни для контроллеров. MvcContrib, кажется, имеет некоторую поддержку Единицы - возможно, Вы могли посмотреть там.

Надеюсь, это поможет.

0
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: