Přidání příspěvku s nahráním souboru   otázka

C#, ASP.NET WebForms

Zdravím,

snažím se, aby po kliknutí na tlačíkto odeslat,se odeslala data z formuláře z FormView a nahrál se soubor, který je vybrán pomocí komponenty FileUpload. Jakmile kliknu na Odeslat tak mi vyskočí následující chyba: Řádek: 2

Chyba: Sys.WebForms.PageRequestManagerServerErrorException: Odkaz na objekt není nastaven na instanci objektu.

    protected void InsertButton_Click(object sender, EventArgs e)
    {
        //FileUpload FileUpload1 = (FileUpload)FormView1.FindControl("FileUpload1");
        FileUpload FileUpload1 = FormView1.FindControl("FileUpload1") as FileUpload;
        string FileName = FileUpload1.FileName;
        int FileSize = FileUpload1.PostedFile.ContentLength;
        string ukol;
        if (string.IsNullOrEmpty(Request.QueryString["id"]))
        {
            ukol = "";
        }
        else
        {
            ukol = Request.QueryString["id"].ToString();
        }
        SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString);
        myConnection.Open();
        SqlCommand cmd_sql = new SqlCommand("dbo.ukoly_vlozeni_prilohy", myConnection);
        cmd_sql.CommandType = CommandType.StoredProcedure;
        cmd_sql.Parameters.AddWithValue("@id_ukolu", ukol);
        cmd_sql.Parameters.AddWithValue("@jmeno_souboru", FileName);
        cmd_sql.Parameters.AddWithValue("@velikost_souboru", FileSize);
        cmd_sql.Parameters.AddWithValue("@id_souboru", 0).Direction = ParameterDirection.InputOutput;
        cmd_sql.ExecuteNonQuery();
        string strid = cmd_sql.Parameters["@id_souboru"].Value.ToString();
        FileUpload1.SaveAs(Server.MapPath("~/ukoly/Uploads/") + strid + "_" + FileName);
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Odpovídají Vaše řádky řádkům ve výpisu, který jste přiložil? Na řádku 2 je otvírací závorka, která sama o sobě chyby v aplikaci těžko vyvolá. Skuste pustit aplikaci v debug řežimu a studio Vám označí řádek, kde chyba nastala. V okně Locals také uvidíte, která lokální proměnná je null a se kterou dále pracujete, jako by null nebyla.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak chyba je v řádku

int FileSize = FileUpload1.PostedFile.ContentLength;

Ale největší chyba je v hned na začátku v

FileUpload FileUpload1 = FormView1.FindControl("FileUpload1") as FileUpload;

, protože proměnná FileUpload1 zůstane prázdná, nenaplní se hodnoutou z komponenty FileUpload co je ve FormView1 v Insert sekci, tím pádem se do databáze zapíšou prázdné hodnoty a soubor se na server neuloží.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak tam dejte kontrolu na null, ať neukládáte do databáze prázdné hodnoty. Co se týče chyby v prvním řádku, s tím Vám asi nepomůžu. Pokud framework to komponentu nemůže najít, tak je pravděpodobně něco špatně.

Doporučil bych Vám zkusit debuggovat pouze příklad

var fileUpload = FormView1.FindControl("FileUpload1");

Tím zjistíte, jestli to vůbec nějaký objekt našlo. Pokud najde, pak to pravděpodobně není objekt typu FileUpload a explicitní přetypování vrátí null.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém bych hledal tady:

FileUpload FileUpload1 = FormView1.FindControl("FileUpload1") as FileUpload;

jmenuje se onen hledaný prvek na formuláři skutečně FileUpload1?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, opravdu se hledaný prvek jmenuje FileUpload1.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A je uvnitř toho FormView? Asi sem pošlete i kus ASPX kódu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ASPX kod:

<my:MyFormView ID="FormView1" runat="server" DataKeyNames="IdUkolu" DataSourceID="SqlDataSource1" RedirectUrl="~/ukoly/" DefaultMode="ReadOnly">
        <InsertItemTemplate>
            <table>
                <tr>
                    <td>Zodpovědná osoba: </td>
                    <td>
                        <asp:DropDownList runat="server" ID="DropDownList3" DataSourceID="SqlDataSource2" Width="183px"
                            DataTextField="Jmeno_Prijmeni" DataValueField="id" Text='<%# Bind("ZodpovednaOsoba")%>' AppendDataBoundItems="true">
                            <asp:ListItem></asp:ListItem>
                        </asp:DropDownList>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="* Zodpovědná osoba musí být uvedena" ForeColor="Red" 
                            ToolTip="Vyberte zodpovědnou osobu" ControlToValidate="DropDownList3" />
                    </td>
                </tr><tr>
                    <td>Termín plnění: </td>
                    <td>
                        <asp:TextBox ID="EndTimeTextBox" runat="server" Text='<%# Bind("termin", "{0:d.M.yyyy}")%>' Width="179px" TextMode="Date" />
                        <ajaxToolkit:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="EndTimeTextBox" FirstDayOfWeek="Monday" 
                            TodaysDateFormat="d.M.yyyy" Format="dd.MM.yyyy" ClearTime="True" />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator12" runat="server" ErrorMessage="* Termín plnění musí být uveden" ForeColor="Red" 
                            ToolTip="Zadejte datum plnění" ControlToValidate="EndTimeTextBox" />
                    </td>
                </tr>
                </table>
                        <ajaxToolkit:HtmlEditorExtender runat="server" ID="HTMLEditor1" TargetControlID="TaskTextBox" EnableSanitization="false" DisplaySourceTab="true">

                        </ajaxToolkit:HtmlEditorExtender>
                        <asp:TextBox ID="TaskTextBox" runat="server" Text='<%# Bind("Zadani") %>' TextMode="MultiLine" Height="400px" Width="860px" />
                        <br />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ErrorMessage="* Úkol musí být vyplněn" ForeColor="Red" 
                            ToolTip="Napiště zadání úkolu" ControlToValidate="TaskTextBox" />
                    
            <br />
            <asp:FileUpload runat="server" ID="FileUpload1" Width="500" /><br /><br />
            <ajaxToolkit:AjaxFileUpload runat="server" ID="AjaxFileUpload1" OnUploadComplete="AjaxFileUpload1_UploadComplete" Visible="false" />

            <asp:Button ID="InsertButton" runat="server" CommandName="Insert" OnClick="InsertButton_Click" Text="Přidat úkol" />
            <asp:Button ID="InsertCancelButton" runat="server" 
                CausesValidation="False" CommandName="Cancel" Text="Zrušit" OnClientClick="javascript: return confirm('Opustit bez uložení?');" />

        </InsertItemTemplate>
        <ItemTemplate>
            ...
        </ItemTemplate>
        <EditItemTemplate>
            ...
        </EditItemTemplate>
    </my:MyFormView>
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste kód místo InsertButton_Click umístit do události FormView ItemCommand.

protected void FormView1_ItemCommand(object sender, FormViewCommandEventArgs e)
{
    if (e.CommandName == "Insert")
    {
        FileUpload FileUpload1 = (FileUpload)FormView1.FindControl("FileUpload1");
        ...

    }
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stále stejný problém, FileUpload1 zůstane prázdný, nenaplní se žádnou hodnotou i když je soubor vybrán...

FileUpload FileUpload1 = (FileUpload)FormView1.FindControl("FileUpload1");
string FileName = FileUpload1.FileName;

FileName je stále prázdný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback