Если вы хотите решить немного другую, но связанную проблему создания объекта Javascript Date из года, месяца, дня, ..., , включая часовой пояс - то есть, если вы хотите разберите строку в Date - тогда вам, очевидно, придется исполнить невероятно сложный танец:
// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34" -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56" -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78" -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100" -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530" -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330" -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330" -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z" -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
var m = timebits.exec(dateString);
var resultDate;
if (m) {
var utcdate = Date.UTC(parseInt(m[1]),
parseInt(m[2])-1, // months are zero-offset (!)
parseInt(m[3]),
parseInt(m[4]), parseInt(m[5]), // hh:mm
(m[6] && parseInt(m[6]) || 0), // optional seconds
(m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
// utcdate is milliseconds since the epoch
if (m[9] && m[10]) {
var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
}
resultDate = new Date(utcdate);
} else {
resultDate = null;
}
return resultDate;
}
То есть вы создаете «время UTC», используя дату без часового пояса (так что вы знаете, в какой локали она находится а именно «локаль» UTC, а не локальная по умолчанию), а затем вручную примените указанное смещение часового пояса.
Не было бы неплохо, если бы кто-то на самом деле думал об объекте даты Javascript более, чем, ооо, пять минут…
Создайте свойство на главной странице и вы получаете к нему доступ со страницы содержимого:
Главная страница:
public partial class BasePage : System.Web.UI.MasterPage
{
private string[] _RequiredRoles = null;
public string[] RequiredRoles
{
get { return _RequiredRoles; }
set { _RequiredRoles = value; }
}
}
Страница содержимого:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load()
{
Master.RequiredRoles = new string[] { /*set appropriate roles*/ };
}
}
Приведение типов Page.Master к вашей главной странице, чтобы вы делали что-то вроде:
((MyMasterPageType)Page.Master).Roles = "blah blah";
Я бы создал базовый класс для всех страниц с контентом, например:
public abstract class BasePage : Page
{
protected abstract string[] RequiredRoles { get; }
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// display the required roles in a master page
if (this.Master != null) {
// value-assignment
}
}
}
А затем я сделал каждую страницу унаследованной от BasePage, и каждая определяла RequiredRoles
public partial class _Default : BasePage
{
protected override string[] RequiredRoles
{
get { return new[] { "Admin", "Moderator" }; }
}
}
Это имеет преимущество чистоты и СУХОЙ обработки кода обработчика OnLoad. И каждая страница, которая наследуется от BasePage, должна определять «RequiredRoles», иначе она не будет компилироваться.
Добавьте директиву page на дочернюю страницу:
<%@ MasterType VirtualPath="~/MasterPage.master" %>
Затем добавьте свойство на главную страницу:
public string Section { get; set; }
Вы можете получить доступ к этому свойству следующим образом:
Master.Section = "blog";