Создание ActionLink с DateTime в строке запроса в ASP.NET MVC

У меня есть поисковая форма с критерием поиска 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 () сам.

5
задан Gaz 7 January 2010 в 18:15
поделиться

7 ответов

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

Существует один уродливый вариант - загрузите исходный код 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 .

4
ответ дан 13 December 2019 в 19:28
поделиться

Можете ли вы указать дату в формате ActionLink? Попробуйте следующее:

Html.ActionLink("Search", 
                "Index", 
                new {BeginDate = 
                      DateTime.Now.ToString("d", new CultureInfo("pt-BR");})

Конечно, это меняет BeginDate на строку вместо DateTime... но может быть это сработает для вас?

1
ответ дан 13 December 2019 в 19:28
поделиться

Для этого мы используем ISO ("s" в строке формата -- YYYY-MM-DDTHH:MM:SS) формат. Он работает корректно, и JavaScript может справиться и с ним.

.
1
ответ дан 13 December 2019 в 19:28
поделиться

Возможно, вы могли бы использовать Model Binder для форматирования и анализа даты? Просто перечитайте статью и заметите, что она не форматирует дату... Вероятно, ничего не получится. Я оставлю ответ, однако, на случай, если он даст непреднамеренное вдохновение :)

.
1
ответ дан 13 December 2019 в 19:28
поделиться
poking around in System.Web.Routing using Reflector it.

похоже на то, что он использует InvariantCulture

Ты действительно шуришь насчет этого? Части Modelbinding и UrlBuilding, которые я проверял, используются CurrentCulture. Можете ли вы проверить, что произойдет, если вы установите CurrentCulture перед отрисовкой ссылки?

.
1
ответ дан 13 December 2019 в 19:28
поделиться

Я создал тестовую форму и с помощью Firebug нашел этот способ получения значения;

$('form').submit(function(event){
  alert(event.originalEvent.explicitOriginalTarget.value);
}); 

К сожалению, только Firefox поддерживает это событие.

-121--738743-

Некоторые вещи следует иметь в виду:

1) Джон прав - если достигнут предел буфера, вызов записи в подпроцессе будет заблокирован. Нужно слить поток stdout, если он не перенаправляется куда-то, что приведет к его автоматическому сливу - как файл. Трубы необходимо осушить, и обычно, если вы можете «присоединить» к выходному сигналу подпроцесса, вы присоединяетесь к трубе.

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

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

-121--2921044-

Во избежание проблем, связанных с региональными настройками и «культурой», Я рассматриваю дату и время как отдельные несвязанные поля, а затем собрать их в DateTime в моем контроллере.

Пример:

Год [] Месяц [] День []

Я всегда представляю отдельные текстовые поля для года, месяца и дня в таком порядке, чтобы не было путаницы между форматом США (месяц/день/год) и более или менее остальным форматом мира (день/месяц/год).

2
ответ дан 13 December 2019 в 19:28
поделиться

Получите книгу ASP.NET MVC 1.0, написанную Скоттом Хансельманом, Скоттом Гутри, Филом Хакком и Робом Конни. На самом деле они делают этот точный сценарий в книге. Они используют определенный маршрут. Я смотрю на это прямо сейчас на стр. 216.

Они делают это, разбив день, месяц и год. Тогда ваша обязанность использовать эти ценности, когда они возвращаются.

1
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

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