Странное поведение ViewState

У меня есть страница Asp.Net (с именем «PostAD»), которая позволяет пользователю загружать до 4 изображений. Функция кнопки загрузки файла выглядит следующим образом:

protected void btnUpload_Click(object sender, EventArgs e)
{
    if ((ViewState["Img1"] != null) && (ViewState["Img2"] != null) && (ViewState["Img3"] != null) && (ViewState["Img4"] != null))
    {
        lblUploadMsg.Text = "You cannot upload more than 4 pictures";
        return;
    }
    if (FileUpload1.HasFile)
    {
        //FileUpload1.Attributes.Clear();
        string fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName);
        if (fileExtension.ToLower() == ".jpg")
        {
            int fileSize = FileUpload1.PostedFile.ContentLength;

            if (FileUpload1.PostedFile.ContentLength < 2097152)
            {

                //FileUpload1.SaveAs(Server.MapPath("~/Temp/" + FileUpload1.FileName));
                //Response.Write("Successfully Done");

                string sp = Server.MapPath("~/ItemPictures/");
                String fn = Guid.NewGuid().ToString() + FileUpload1.FileName.Substring(FileUpload1.FileName.LastIndexOf("."));
                if (sp.EndsWith("\\") == false)
                    sp += "\\";
                sp += fn;
                FileUpload1.PostedFile.SaveAs(sp);
                lblUploadMsg.ForeColor = System.Drawing.Color.Green;
                lblUploadMsg.Text = "Picture Uploaded successfully. You can upload upto 4 pictures";

                if (ViewState["Img1"] == null)
                {
                    ViewState["Img1"] = "~/ItemPictures/" + fn;
                }
                else if (ViewState["Img2"] == null)
                {
                    ViewState["Img2"] = "~/ItemPictures/" + fn;
                }
                else if (ViewState["Img3"] == null)
                {
                    ViewState["Img3"] = "~/ItemPictures/" + fn;
                }
                else if (ViewState["Img4"] == null)
                {
                    ViewState["Img4"] = "~/ItemPictures/" + fn;
                }
            }
            else
            {
                lblUploadMsg.Text = "Maximum 2MB files are allowed";
            }
        }
        else
        {
            lblUploadMsg.Text = "Only JPG files are allowed";
        }
    }
    else
    {
        lblUploadMsg.Text = "No File was Selected";
    }
    ShowAvailblImgs();
}

У меня есть четыре изображения Asp.Net, которые невидимы во время загрузки страницы. Чтобы показать их, у меня есть следующий код.

private void ShowAvailblImgs()
{
    if (ViewState["Img1"] != null)
    {
        //The string URL variable is used just to show what value ViewState["image1"] currently has.
        string URL = (string)ViewState["img1"];
        Response.Write(URL);
        Image1.ImageUrl = (string)ViewState["img1"];
        Image1.Width = 130;
        Image1.Height = 130;
        Image1.Visible = true;
    }
    else
        Image1.Visible = false;
    if (ViewState["Img2"] != null)
    {
        Image2.ImageUrl = (string)ViewState["img2"];
        Image2.Width = 130;
        Image2.Height = 130;
        Image2.Visible = true;
    }
    else
        Image2.Visible = false;
    if (ViewState["Img3"] != null)
    {
        Image3.ImageUrl = (string)ViewState["img3"];
        Image3.Width = 130;
        Image3.Height = 130;
        Image3.Visible = true;
    }
    else
        Image3.Visible = false;
    if (ViewState["Img4"] != null)
    {
        Image4.ImageUrl = (string)ViewState["img4"];
        Image4.Width = 130;
        Image4.Height = 130;
        Image4.Visible = true;
    }
    else
        Image4.Visible = false;
}

У меня очень странное поведение переменной ViewState. При загрузке изображений они не отображаются в элементе управления изображением Asp.Net. Вместо этого отображаются пустые области изображения. Хотя переменная URL, которую я использовал, печатает точный путь к изображению. После сохранения изображения (на самом деле это пустые области изображения) сохраняется моя страница .aspx. Я использовал переменную сеанса, которая работала нормально, но по некоторым причинам я хочу использовать переменную ViewState.


person user2599269    schedule 26.08.2013    source источник
comment
В отличие от форумов, мы не используем слова «Спасибо» или «Любая помощь приветствуется» или подписи на Stack Overflow. См. Запрещены ли слоганы и подписи? и Должны ли быть удалены слова "Привет", "спасибо", слоганы и приветствия из сообщений?.   -  person John Saunders    schedule 27.08.2013


Ответы (2)


ViewState в порядке. Вы используете другой регистр для строки индекса ViewState, поэтому они не относятся к одному и тому же свойству ViewState. «Img1» не равно «img1».

ViewState["Img1"] != null)
    {
        Image2.ImageUrl = (string)ViewState["img1"];

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

    const string image1 = "img1";
    const string image2 = "img2";
    const string image3 = "img3";
    const string image4 = "img4";

Или обратитесь к моему сообщению в блоге, чтобы создать строго типизированные псевдосвойства с использованием методов расширения. http://coding.grax.com/2013/06/simple-strongly-typed-pattern-for.html

person Grax32    schedule 26.08.2013
comment
Спасибо, ваш ответ действительно полезен - person user2599269; 27.08.2013

Не хочу ошибиться, но, читая документацию, было написано, что

«Состояние просмотра используется для сохранения страниц и управляющих значений между обращениями» http://msdn.microsoft.com/en-us/library/ms178198(v=vs.85).aspx

Вы пытались поместить URL-адреса в переменные, а затем назначить ViewState["imgX"] и попытаться выполнить еще одну обратную передачу и посмотреть, содержит ли ViewState["imgX"] URL-адрес?

person Alessio    schedule 26.08.2013