Преобразование типов при помощи необычных преобразований типа. Хотя не скрытая функция, его довольно хитрое.
Пример:
, Если необходимо было знать, как плавание хранилищ компилятора, просто попробуйте это:
uint32_t Int;
float flt = 10.5; // say
Int = *(uint32_t *)&flt;
printf ("Float 10.5 is stored internally as %8X\n", Int);
или
float flt = 10.5; // say
printf ("Float 10.5 is stored internally as %8X\n", *(uint32_t *)&flt);
Примечание умное использование преобразований типа. Преобразование адреса переменной (здесь & flt) к желаемому типу (здесь (uint32_t *)) и извлечение его содержания (применение '*').
Это работает другая сторона выражения также:
*(float *)&Int = flt;
Это могло также быть выполнено с помощью объединения:
typedef union
{
uint32_t Int;
float flt;
} FloatInt_type;
Двоеточие в URL-адресе вашего первого примера приведет к ошибке (неверный запрос), поэтому вы не сможете сделать именно то, что ищете. В остальном использование DateTime в качестве параметра действия наиболее вероятно.
Если вы используете маршрутизацию по умолчанию, эта третья часть URL-адреса вашего примера будет использовать значение DateTime в качестве параметра {id}. Итак, ваш метод Action может выглядеть следующим образом:
public ActionResult Index(DateTime? id)
{
return View();
}
Вы, вероятно, захотите использовать Datetime, допускающее значение NULL, как и я, поэтому, если этот параметр не включен, это не вызовет исключения. Конечно, если вы не хотите, чтобы он назывался «id», добавьте другую запись маршрута, заменив {id} вашим именем по вашему выбору.
Пока текст в URL-адресе будет преобразован в допустимое значение DateTime, это все, что вам нужно сделать. Что-то вроде следующего работает нормально и будет без ошибок уловлено в вашем методе Action:
<%=Html.ActionLink("link", "Index", new { id = DateTime.Now.ToString("dd-MM-yyyy") }) %>
Загвоздка в этом случае, конечно, в том, что я не включил время. Я не уверен, что есть какие-либо способы отформатировать (действительную) строку даты со временем, не представленным двоеточиями, поэтому, если вы ДОЛЖНЫ включить время в URL-адрес, вам может потребоваться использовать свой собственный формат и проанализировать результат обратно в DateTime вручную. Допустим, мы заменили двоеточие на "!" в ссылке на действие: new {id = DateTime.Now.ToString ("dd-MM-yyyy HH! mm")}
.
Ваш метод действия не сможет проанализировать это как дату, поэтому лучше bet в этом случае, вероятно, примет его как строку:
public ActionResult Index(string id)
{
DateTime myDate;
if (!string.IsNullOrEmpty(id))
{
myDate = DateTime.Parse(id.Replace("!", ":"));
}
return View();
}
Изменить: Как отмечалось в комментариях, есть некоторые другие решения, возможно, лучше, чем мое. Когда я изначально писал этот ответ, я считаю, что пытался сохранить суть формата даты и времени как можно лучше, но, очевидно, кодирование URL-адресов было бы более правильным способом справиться с этим. +1 к комментарию Влада.
Ваш метод действия не сможет проанализировать это как дату, поэтому лучше всего в этом случае, вероятно, принять его как строку:
public ActionResult Index(string id)
{
DateTime myDate;
if (!string.IsNullOrEmpty(id))
{
myDate = DateTime.Parse(id.Replace("!", ":"));
}
return View();
}
Изменить: Как отмечено в комментариях, возможно, есть некоторые другие решения лучше, чем моя. Когда я изначально писал этот ответ, я считаю, что пытался сохранить суть формата даты и времени как можно лучше, но, очевидно, кодирование URL-адресов было бы более правильным способом справиться с этим. +1 к комментарию Влада.
Ваш метод действия не сможет проанализировать это как дату, поэтому лучше всего в этом случае, вероятно, принять его как строку:
public ActionResult Index(string id)
{
DateTime myDate;
if (!string.IsNullOrEmpty(id))
{
myDate = DateTime.Parse(id.Replace("!", ":"));
}
return View();
}
Изменить: Как отмечено в комментариях, возможно, есть некоторые другие решения лучше, чем моя. Когда я изначально писал этот ответ, я считаю, что пытался сохранить суть формата даты и времени как можно лучше, но, очевидно, кодирование URL-адресов было бы более правильным способом справиться с этим. +1 к комментарию Влада.
Использовать значение тиков. Довольно просто перестроить в структуру DateTime
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
Типичным форматом URI для ASP .NET MVC является Controller / Action / Id, где Id - целое число
Я бы посоветовал отправлять значение даты в качестве параметра, а не как часть route:
mysite/Controller/Action?date=21-9-2009 10:20
Если это все еще вызывает проблемы, дата может содержать символы, которые не разрешены в URI и должны быть закодированы. Проверьте:
encodeURIComponent(yourstring)
Это метод в Javascript.
На стороне сервера:
public ActionResult ActionName(string date)
{
DateTime mydate;
DateTime.Tryparse(date, out mydate);
}
FYI, любой параметр URL-адреса может быть сопоставлен с параметром метода действия, если имена совпадают.
Сначала вы должны добавить новый маршрут в global.asax:
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{date}",
new { controller="YourControllerName", action="YourActionName", date = "" }
);
The на вашем контроллере:
public ActionResult MyActionName(DateTime date)
{
}
Не забудьте сохранить маршрут по умолчанию в нижней части метода RegisterRoutes. Имейте в виду, что движок попытается преобразовать любое значение, которое вы отправляете в {date}, как пример DateTime, поэтому, если оно не может быть преобразовано, будет создано исключение. Если ваша строка даты содержит пробелы или: вы можете HTML.Encode их, чтобы URL мог быть правильно проанализирован. Если нет, то у вас может быть другое представление DateTime.