2013-08-26 2 views
0

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

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. Я использовал переменную Session, которая работала нормально, но по некоторым причинам я хочу использовать переменную ViewState.

+0

В отличие от форумов, мы не используем «Спасибо», или «Любая помощь оценена» или подписи на [so]. См. «[Запрещены ли теги и подписи?] (Http://meta.stackexchange.com/questions/5029/are-taglines-signatures-disallowed)» и «[Должны« Привет »,« спасибо », теги и приветствия удаляться из сообщений?] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts). –

ответ

1

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

+0

Спасибо, ваш ответ действительно полезен – user2599269

1

Я не хочу сказать неправильную вещь, но, читая документации, это было написано, что

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

Есть вы пытались поместить URL-адреса в переменные, а затем назначить ViewState ["imgX"] и попытаться сделать другой Postback и посмотреть, содержит ли ViewState ["imgX"] URL-адрес?

Смежные вопросы