Первый шаг - переписать метод RegisterGlobalFilters, чтобы использовать jsreport в качестве веб-сервера:
public static ILocalWebServerReportingService RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
var rs = new LocalReporting()
.Configure(cfg =>
{
cfg.BaseUrlAsWorkingDirectory();
return cfg;
})
.UseBinary(JsReportBinary.GetBinary())
.AsWebServer()
.Create();
rs.StartAsync().GetAwaiter().GetResult();
filters.Add(new JsReportFilterAttribute(rs));
return rs;
}
, а затем нам нужно использовать службу отчетов, на которую ссылаются, чтобы остановить работу приложения в Global.asax:
[111 ]Типы зависят к Вашей инициализации:
var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool
, Но смотрят на этот пример:
var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean
тип Ваших переменных зависит от присвоенного значения в JavaScript.
Нет это не безопасно. Вы могли позже сделать, var IsLoggedIn = "Foo";
и JavaScript не бросят ошибку.
возможно сделать
var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);
, можно также передать не логическую переменную в new Boolean()
, и это сделает булевскую переменную IsLoggedIn.
var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true
Если Вы хотите IsLoggedIn
рассматриваться как булевскую переменную, необходимо инициализировать следующим образом:
var IsLoggedIn=true;
при инициализации его с var IsLoggedIn=1;
тогда, это будут рассматривать как целое число.
Однако в любое время переменная IsLoggedIn
могла относиться к другому типу данных:
IsLoggedIn="Hello World";
Это не вызовет ошибку.
Вы можете использование и тестировать неинициализированные переменные, по крайней мере, на их 'definedness'. Как это:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
, Кроме того, существует много возможностей: если Вы не интересуетесь точным использованием типов '==' оператор (или! [переменная]/!! [переменная]) для сравнения (именно это Douglas Crockford называет 'truthy' или 'falsy', я думаю). В этом случае присвоение верного или 1 или '1' к unitialized переменной всегда возвращает true при выяснении. Иначе [если Вам нужно безопасное с точки зрения типов сравнение], используют '===' для сравнения.
var thisMayBeTrue;
thisMayBeTrue = 1;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
thisMayBeTrue = '1';
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, in this case, using == or !! '1' is implicitly
// converted to 1 and 1 is implicitly converted to true)
thisMayBeTrue = true;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> true
thisMayBeTrue = 'true';
alert(thisMayBeTrue == true); //=> false
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, here's no implicit conversion of the string 'true'
// it's also a demonstration of the fact that the
// ! or !! operator tests the 'definedness' of a variable.
пз: Вы не можете протестировать 'definedness' на несуществующие переменные все же. Так:
alert(!!HelloWorld);
дает ссылочную Ошибку ('HelloWorld, не определяется')
(там лучшее слово для 'definedness'? Простите моему нидерландскому языку так или иначе; ~)
Переменные в JavaScript не имеют типа. Ненулевой, непустой, непустой и true
"верны". Нуль, пустая, неопределенная, пустая строка и false
являются "ложью".
существует булев тип, хотя, как литералы true
и false
.
Переменная станет тем, что когда-либо вводит Вас, присваивают его. Первоначально это undefined
. При присвоении его 'true'
, это станет строкой при присвоении его true
, это станет булевской переменной при присвоении его 1
, это станет числом. Последующие присвоения могут изменить тип переменной позже.