У меня есть поисковая форма с критерием поиска DateTime плюс некоторые другие критерии:
<form method="get" action="/app/search">
<input type="text" value="13/01/2010" name="BeginDate"/>
<input type="text" value="blah" name="SomeOtherCriterion"/>
<form>
Таким образом, у меня есть Поисковый контроллер с Действием по умолчанию (давайте назовем это Индексом), и с параметром SearchCriteria.
public class SearchController
{
public ActionResult Index(SearchCriteria searchCriteria) {//blah }
}
public class SearchCriteria
{
public DateTime BeginDate {get; set;}
public string SomeOtherCriterion {get; set;}
}
Теперь, если я хочу создать ActionLink, передающий в значении SearchCriteria, таким образом:
Html.ActionLink("Search", "Index", searchCriteria)
Я получаю параметр строки запроса BeginDate в американском формате. Наблюдение Google и ввод по абсолютному адресу вокруг в Системе. Сеть. Маршрутизация использования Отражателя, который это, кажется, потому что это использует InvariantCulture, таким образом, нет ничего, которое я могу делать с этим.
Кажется, что никто не задал этот вопрос прежде, таким образом, я предполагаю, что делаю что-то очень глупое.... Помогите!
Править: Передача в SearchCriteria к ActionLink, а не анонимному объекту для показа, почему я не могу только сделать пользовательского ToString () сам.
Учитывая, что структура, по-видимому, жестко закодирована для обработки этой части данных с использованием инвариантнойкультуры, я не думаю, что есть много, что вы можете сделать, чтобы он работал прозрачно.
Существует один уродливый вариант - загрузите исходный код MVC и вырвать код для всех нарушенных классов из
down - ParsedRoute
, чтобы создать свой собственный Routebase
Реализация, которая делает то, что вам нужно.
Если я абсолютно был , чтобы сохранить декларацию The DateTime на классе Classcriteria
, то это маршрут (извините за каламбур), который я бы выбрал.
Тем не менее, гораздо более легкое решение было бы изменение класса Searchcriteria для использования слегка другая декларация для поля DATETIME, основанное на таком типе:
public class MyDateTime
{
public DateTime Value { get; set; }
//for passing MyDateTime in place of a DateTime without casting
public static implicit operator DateTime(MyDateTime instance) { return instance.Value; }
//so you can assign a MyDateTime from a DateTime without a cast
//- e.g. MyDateTime dt = DateTime.Now
public static implicit operator MyDateTime(DateTime instance) { return new MyDateTime() { Value = instance }; }
//override ToString so that CultureInfo.CurrentCulture is used correctly.
public override string ToString()
{
return Value.ToString(CultureInfo.CurrentUICulture);
}
}
в теории, вы должны быть в состоянии развернуть это изменение без много суеты.
Большая работа может быть, если у вас есть много кода, в котором используются участники (например, .days etc) экземпляра DateTime в Searchcriteria: вы либо должны воспроизводить тех членов MyDateTime
, упаковка вокруг Внутреннее значение DateTime
или измените весь код для использования .value.member
.
Можете ли вы указать дату в формате ActionLink? Попробуйте следующее:
Html.ActionLink("Search",
"Index",
new {BeginDate =
DateTime.Now.ToString("d", new CultureInfo("pt-BR");})
Конечно, это меняет BeginDate на строку вместо DateTime... но может быть это сработает для вас?
Для этого мы используем ISO ("s" в строке формата -- YYYY-MM-DDTHH:MM:SS) формат. Он работает корректно, и JavaScript может справиться и с ним.
.Возможно, вы могли бы использовать Model Binder для форматирования и анализа даты? Просто перечитайте статью и заметите, что она не форматирует дату... Вероятно, ничего не получится. Я оставлю ответ, однако, на случай, если он даст непреднамеренное вдохновение :)
.poking around in System.Web.Routing using Reflector it.
похоже на то, что он использует InvariantCulture
Ты действительно шуришь насчет этого? Части Modelbinding и UrlBuilding, которые я проверял, используются CurrentCulture. Можете ли вы проверить, что произойдет, если вы установите CurrentCulture перед отрисовкой ссылки?
.Я создал тестовую форму и с помощью Firebug нашел этот способ получения значения;
$('form').submit(function(event){
alert(event.originalEvent.explicitOriginalTarget.value);
});
К сожалению, только Firefox поддерживает это событие.
-121--738743-Некоторые вещи следует иметь в виду:
1) Джон прав - если достигнут предел буфера, вызов записи в подпроцессе будет заблокирован. Нужно слить поток stdout, если он не перенаправляется куда-то, что приведет к его автоматическому сливу - как файл. Трубы необходимо осушить, и обычно, если вы можете «присоединить» к выходному сигналу подпроцесса, вы присоединяетесь к трубе.
2) Ввод/вывод в выходной поток , вероятно, буферизуется, что означает, что если подпроцесс записывает некоторую информацию в stdout без явного вызова flush ()
, что почти всегда имеет место, выходные данные могут не отображаться. Flush вызывается автоматически при выходе из процесса, поэтому, если это короткий небольшой подпроцесс, вы должны быть в порядке, но если это не так, у вас нет реального способа заставить его вывод появиться, когда вы хотите.
3) Именованные каналы - это, по сути, буфер, поддерживаемый операционной системой, который можно записать и прочитать, т.е. они подобны файлу, в который можно записывать данные из одного процесса и считывать данные из другого, не имея при этом накладных расходов на наличие файла на диске. Очень удобно для связи между процессами, но все ограничения ввода-вывода с буферизацией/полным буфером все еще применяются.
-121--2921044-Во избежание проблем, связанных с региональными настройками и «культурой», Я рассматриваю дату и время как отдельные несвязанные поля, а затем собрать их в DateTime в моем контроллере.
Пример:
Год [] Месяц [] День []
Я всегда представляю отдельные текстовые поля для года, месяца и дня в таком порядке, чтобы не было путаницы между форматом США (месяц/день/год) и более или менее остальным форматом мира (день/месяц/год).
Получите книгу ASP.NET MVC 1.0, написанную Скоттом Хансельманом, Скоттом Гутри, Филом Хакком и Робом Конни. На самом деле они делают этот точный сценарий в книге. Они используют определенный маршрут. Я смотрю на это прямо сейчас на стр. 216.
Они делают это, разбив день, месяц и год. Тогда ваша обязанность использовать эти ценности, когда они возвращаются.