Установка необходимых npm
пакетов
npm install typescript
npm install gulp@^4.0.0
npm install gulp-typescript@^5.0.0
npm install del
npm install ts-nameof
gulp-typescript
БЕЗ проекта Подготовка gulpfile.js
const gulp = require('gulp');
const ts = require('gulp-typescript');
const tsNameof = require("ts-nameof");
const del = require('del');
gulp.task('clean', () => {
return del(['./dist/**']);
});
gulp.task('ts', function () {
return gulp.src('./src/**/*.ts')
.pipe(ts({
getCustomTransformers: () => ({ before: [tsNameof] })
}))
.pipe(gulp.dest('./dist'));
});
gulp.task('default',
gulp.series(
'clean',
'ts',
));
gulp-typescript
С проектом, использующим существующее tsconfig.json
Используя gulp-typescript
с существующим tsconfig.json
, необходимо настроить gulpfile.js
там, где настроена опция getCustomTransformers
:
Подготовка gulpfile.js
const gulp = require('gulp');
const ts = require('gulp-typescript');
const tsNameof = require("ts-nameof");
const del = require('del');
gulp.task('clean', () => {
return del(['./dist/**']);
});
var tsProject = tsProject || null;
gulp.task('ts::Project', function () {
if (!tsProject) {
tsProject = ts.createProject(
'tsconfig.json',
{
getCustomTransformers: () => ({ before: [tsNameof] })
}
);
}
return gulp.src('./src/**/*.ts')
.pipe(tsProject())
.pipe(gulp.dest("./dist"));
});
gulp.task('tsProject',
gulp.series(
'clean',
'ts::Project',
));
Выполнить gulpfile.js
с
./node_modules/.bin/gulp
или
./node_modules/.bin/gulp tsProject
Выполнить переданный файл tsNameofTest.js
node dist/tsNameofTest.js // expected output: nameString: log
Примечание: если цель typescript
равна ESNext
, я получил ошибки выполнения со следующим оператором в файле .ts
, как это было в финале Файл .js
тоже:
import 'ts-nameof';
Я получил исправлено, заменив его на
/// <reference path="../node_modules/ts-nameof/ts-nameof.d.ts" />
Теперь даже можно установить определение типа из ts-nameof
во всем мире:
npm install @types/ts-nameof --save-dev
Ни import
, ни /// <reference path="" />
не является необходимым.
Вот то, как я закончил тем, что решил это:
LinkVisibility
.LinkVisibility
экземпляр к набору для каждой строки.LinkVisibility
для каждого PK в наборе (DataKeyNames установлен в GridView), и я установил ссылки соответственно.Я не знаю, что это - лучший способ сделать это, но он, конечно, работает, который является больше, чем я могу сказать для чего-либо еще, что попробовал.
1) У Вас мог быть Метод - ProcessDataRows (), который назвать однажды на grid_DataBound (...). И затем когда Вам нужен он после PostBack.
И тот способ, которым Вы обрабатываете все строки, когда Вы хотите.
2) У Вас могли быть методы как ShowParentLink (). Это затем связывается с LinkButton в сетке (если бы Вы используете ItemTemplate), и ссылка имела бы
Visible='<%#ShowParentLink()%>'
Я ожидал бы, что состояние отображения также отразит то, что Вы удалили некоторые ссылки (предполагающий, что они были удалены, прежде чем состояние отображения было сохранено).
Возможно, это - вопрос, который необходимо задать, 'почему удаленные ссылки все еще появляются в состоянии отображения?'.
Страница не может обработать события возврата, если она не восстановлена точно, как это было прежде (обратная передача). Если Вы повторно скрываете свои ссылки во время страницы-init, то Ваши события щелчка и такой должны стрелять. К сожалению, не видя некоторый пример кода я не могу стать более конкретным.
Также RowDataBound данных не стреляет, потому что Вы не привязка данных. Вы восстанавливаете страницу от состояния отображения - "привязка состояния отображения" из-за отсутствия лучшего слова.
void Process Rows()
{
... do something
... process complete
datagrid.DataBind();
}
Другое решение состоит в том, чтобы поместить логику в запрос LINQ, так, чтобы Вы закончили с булевым полем LINQ как "ShowParentLink". Затем можно просто связать Свойство видимости поля HyperLink к тому значению - никакой требуемый RowDataBound.