ddgjgj Ответов: 2

Asp.net формат рендеринга mvc5 datetime


This is the model :

e[DataType(DataType.Date)]

    public Nullable<System.DateTime> PublishDate { get; set; }
This is the view :

e   <dt>
            @Html.DisplayNameFor(model => model.PublishDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.PublishDate)
        </dd>
When I am on English version of the page , date renders in this way for example 14/08/2017 , and when i change language in French then date renders in this way 14.8.2017 . Why it is happining that , can anyone help me , for no matter language selected , the date format should always be the same .


Что я уже пробовал:

я объяснил проблему и свое решение выше.

Namith Krishnan E

вы меняете язык по культуре, верно?

ddgjgj

Да,и сохраните это значение в сеансе.
@формат HTML.Actionlink панели("АН", "ChangeCulturee", "язык", новый { Ланг = "Ан", returnurl в = этот.Запрос.RawUrl }, null)

2 Ответов

Рейтинг:
4

Richard Deeming

Если вы хотите управлять форматом для определенного поля, используйте DisplayFormat атрибут:
Класс DisplayFormatAttribute / Microsoft Docs[^]

[DisplayFormat("dd-MMM-yyyy")]
public DateTime? PublishDate { get; set; }
(NB: DateTime? является сокращенным вариантом написания Nullable<DateTime>.)

Если вы хотите переопределить формат для всех дат, создайте шаблон отображения в Views\Shared\DisplayTemplates\Date.cshtml:
@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("dd-MMM-yyyy")
}
а затем добавьте DataType атрибут к любым свойствам, которые должны показывать только дату:
[DataType(DataType.Date)]
public DateTime? PublishDate { get; set; }


Если вы хотите отключить автоматическую глобализацию для всего приложения, вы можете изменить web.config файл. Вероятно, у вас есть культура, установленная на "авто":
<configuration>
  <system.web>
    <globalization culture="auto" uiCulture="auto" />
  </system.web>
</configuration>
Это устанавливает культуру на основе предпочтительного языка пользователя.

Замените "авто" кодом культуры, которую вы хотите использовать. Например:
<configuration>
  <system.web>
    <globalization culture="en-GB" uiCulture="en-GB" />
  </system.web>
</configuration>

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

Автоматический выбор культур для локализации в ASP.NET -веб-журнал Рика Штрала[^]


Рейтинг:
13

Namith Krishnan E

Попробуйте сделать это, изучая культуру. Установите newCulture как свою измененную культуру

CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy";
newCulture.DateTimeFormat.DateSeparator = "-";
Thread.CurrentThread.CurrentCulture = newCulture;






Заменить на этот код

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
//It's important to check whether session object is ready
if (HttpContext.Current.Session != null)
{
CultureInfo ci = (CultureInfo)this.Session["Culturee"];
//Checking first if there is no value in session 
//and set default language 
//this can happen for first user's request
if (ci == null)
{
//Sets default culture to english invariant
string langName = "en";

//Try to get values from Accept lang HTTP header
if (HttpContext.Current.Request.UserLanguages != null && 
HttpContext.Current.Request.UserLanguages.Length != 0)
{
//Gets accepted list 
langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2);
}
ci = new CultureInfo(langName);
this.Session["Culturee"] = ci;
}
//Finally setting culture for each request

ci.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy";
ci.DateTimeFormat.DateSeparator = "-";
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = ci;

//Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);


  
}
}


ddgjgj

Это глобальный ... асакс


охраняемых недействительными Application_AcquireRequestState(объект отправителя, EventArgs в электронной)
{
// Важно проверить, готов ли объект сеанса
если (объект HttpContext.Тока.Сессия != null)
{
Свойство сі = (значениях)этого.Сессия ["Культура"];
//Сначала проверьте, нет ли значения в сеансе
//и установите язык по умолчанию
//это может произойти по первому запросу пользователя
if (ci = = null)
{
// Устанавливает культуру по умолчанию на английский инвариант
строка langName = " en";

// Попробуйте получить значения из HTTP-заголовка Accept lang
если (объект HttpContext.Тока.Запрос.UserLanguages != null &&
Свойство HttpContext.Тока.Запрос.Языки пользователей.Длина != 0)
{
//Получает список разрешенных
langName = свойство HttpContext.Тока.Запрос.UserLanguages[0].Подстрока(0, 2);
}
ci = new CultureInfo(langName);
этот.Сессия ["культура"] = ci;
}
// Наконец, установка культуры для каждого запроса
Нить.CurrentThread.Currentuiculture выполняющегося = ки;
Нить.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ки.Название);
}
}



А это контролер :

public ActionResult ChangeCulturee(string lang, string returnUrl)
{
Session ["Culturee"] = new CultureInfo(lang);
return Redirect(returnUrl);
}


Что мне здесь менять , собственно , где?!

Namith Krishnan E

обновлено решение

ddgjgj

Гений!

Namith Krishnan E

:)