Вложенные повторители и параметры SqlDataSource

Важно изменить constantPath на "\\\\A\\B\\C\\D\\"

private string[] GetListOfDocumentLink()
{
   string path = string.Empty;
   string constantPath = "\\\\A\\B\\C\\D\\";

   string folderName = string.Empty;
   string year = string.Empty;
   // determine folderName and year.  

   path = constantPath
        + Path.DirectorySeparatorChar.ToString()
        + folderName
        + Path.DirectorySeparatorChar.ToString()
        + year;

        var filter = Berichtsnummer + "*.pdf";

        string[] allFiles = Directory.GetFiles(path, filter);
        return allFiles;
}

Теперь вы можете отправить метод path - DownloadDocument:

public async Task<IActionResult> DownloadDocument(string path)
{
   byte[] berichtData = null;
   FileInfo fileInfo = new FileInfo(path);
   long berichtFileLength = fileInfo.Length;
   FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
   BinaryReader br = new BinaryReader(fs);
   berichtData = br.ReadBytes((int)berichtFileLength);

   return File(berichtData, MimeTypeHelper.GetMimeType("pdf"));
}
6
задан Tony Peterson 29 January 2009 в 13:12
поделиться

4 ответа

Я думаю, что лучший способ состоял бы в том, чтобы обработать событие ItemDataBound Внешнего повторителя, Найти внутреннее управление DataSource и установить SelectParameter для него.

    void MyOuterRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
    {
    // Find the Inner DataSource control in this Row.
    SqlDataSource s = (SqlDataSource)e.Item.FindControl("InnerDataSource");

    // Set the SelectParameter for this DataSource control
    // by re-evaluating the field that is to be passed.
    s.SelectParameters["MyParam"].DefaultValue = DataBinder.Eval(e.Item.DataItem, "MyFieldValueToPass").ToString();
    }

Для примера с помощью DataList проверьте быстрые запуски ASP.NET здесь

P.S.: посмотрите ответ Tony ниже для важного исправления к вышеупомянутому представленному отрывку. В частности, было бы важно проверить ItemType текущего RepeaterItem. С другой стороны, это - превосходная практика, чтобы всегда проверить на пустые указатели на каждом объекте.

4
ответ дан 8 December 2019 в 16:10
поделиться

Я думаю, что вызов к FindControl возвращает пустой указатель, потому что необходимо сначала звонить, FindControl на вложенном повторителе затем называют FindControl на возвращенном повторителе.

Repeater rpt  = (Repeater)e.Item.FindControl("rptNested");
SqlDataSource s = (SqlDataSource)rpt.FindControl("InnerDataSource");
1
ответ дан 8 December 2019 в 16:10
поделиться

Ответ Cerebrus работает за исключением того, что существует одна выгода. Вы получите пустые исключительные ситуации, если Вы не будете следовать правилам этого вопроса, я думаю:

Как получить доступ к объекту, являющемуся данными, связанными во время ItemDataBound?

По существу я должен проверить, чтобы удостовериться, что рассматриваемый объект является объектом или переменным объектом, иначе заголовки и нижние колонтитулы доставят неприятности.

Править: Я также получил ошибку при попытке использовать FindControl для получения DataSource. FindControl возвратил пустой указатель поэтому, когда я пошел для доступа к источнику данных, я получил вторую пустую исключительную ситуацию. Таким образом, я закончил тем просто, что получил доступ к объекту непосредственно. Источник данных объявляется в файле разработчика так или иначе. Таким образом с этим, я наконец заставил вложенные повторители работать.

// Find the Inner DataSource control in this Row.

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == 
    ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
{
    CellsDataSource.SelectParameters["testRunID"].DefaultValue = 
        DataBinder.Eval(e.Item.DataItem, "TestRunID").ToString();
}
3
ответ дан 8 December 2019 в 16:10
поделиться

Можно хотеть изучить технику, которая уменьшит сумму вызовов sproc. Возможно возвратить несколько наборов результатов из той же хранимой процедуры. Набор данных .NET имеет способность определить отношения между несколькими таблицами данных, помогая взять datarow в одной таблице и получить все дочерние узлы в другой таблице данных. Исключая:

exampleData.Relations.Add(New DataRelation("FOO_RELATION", exampleData.Tables["TABLE_A"].Columns["ID"], exampleData.Tables["TABLE_B"].Columns["PARENT_ID"]));

Затем от любого datarow в TABLE_A можно получить доступ ко всем детям как это:

DataRow[] childRows = row.GetChildRows("FOO_RELATION");

Это более эффективно и по моему скромному мнению легче также. Таким образом, Вы не должны печь вызовы sproc в обработчики событий для Вашего повторителя.

3
ответ дан 8 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: