2013-03-21 17 views
6

Otrzymuję błąd 500 wewnętrzny serwera po kliknięciu na Ajax.ActionLink. Mam stronę profilu, która składa się z wielu elementów. Każda cząstka wykonuje wywołania Ajax na serwerze, aby umożliwić edycję informacji o użytkownikach związanych z tym konkretnym elementem.MVC4 - Ajax.ActionLink() GET zwraca 500 wewnętrzny błąd serwera

Zaimplementowałem 3 części z tą funkcjonalnością, która działa dobrze. Ten, nad którym teraz pracuję, powinien początkowo pokazać listę przesłanych obrazów - jeśli użytkownik nie załadował żadnych zdjęć, pojawi się wspomniany wcześniej Ajax.ActionLink, który po kliknięciu wprowadzi użytkownika w części, która ułatwia przesyłanie obrazów.

Oto, co widzę w Chrome, kiedy uderzył w link:

enter image description here

oto GET i POST ActionResults:

// 
    // GET: /Tenants/TenantUploadReference 

    [HttpGet] 
    public ActionResult TenantUploadReference() 
    { 
     try 
     { 
      var currentTenant = tenantRepository.GetLoggedInTenant(); 
      if (currentTenant.ReferencePhotos == null) 
      { 
       currentTenant.ReferencePhotos = currentTenant.ReferencePhotos ?? new List<ReferencePhoto>(); 
      } 
      return PartialView("_TenantUploadReferencePartial", currentTenant.ReferencePhotos.ToList()); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("", e); 
      return View(); 
     } 
    } 

    // 
    // POST: /Tenants/TenantUploadReference 

    [HttpPost] 
    public ActionResult TenantUploadReference(HttpPostedFileBase file, Tenant tenant) 
    { 
     try 
     { 
      if (file != null) 
      { 
       if (file.ContentLength > 10240) 
       { 
        ModelState.AddModelError("file", "The size of the file should not exceed 10 KB"); 
        return View(); 
       } 

       var supportedTypes = new[] { "jpg", "jpeg", "png", "JPG", "JPEG", "PNG" }; 
       var fileExt = System.IO.Path.GetExtension(file.FileName).Substring(1); 

       if (!supportedTypes.Contains(fileExt)) 
       { 
        ModelState.AddModelError("photo", "Invalid type. Only the following types (jpg, jpeg, png) are supported."); 
        return View(); 
       } 

       using (var db = new LetLordContext()) 
       { 
        var reference = db.Image.Create<ReferencePhoto>(); 

        // Convert HttpPostedFileBase to byte array 
        MemoryStream target = new MemoryStream(); 
        file.InputStream.CopyTo(target); 
        byte[] photo = target.ToArray(); 

        reference.File = photo; 
        reference.Format = fileExt; 
        reference.DateUploaded = DateTime.Now.Date; 
        reference.Description = ""; 
        reference.Name = ""; 

        db.Image.Add(reference); 
        db.SaveChanges(); 

        return PartialView("_TenantReferencePhotosPartial", file); 
       } 

      } 
      else 
      { 
       return View(); 
      } 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("", e); 
      return View(); 
     } 
    } 

Kiedy przejść przez debugger z przerwą punkt na GET ActionResult trafia return PartialView i nie są zgłaszane wyjątki.

W _TenantUploadReferencePartial używam

@using (Ajax.BeginForm("TenantUploadReference", "Tenants", FormMethod.Post, new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", UpdateTargetId = "tenant-reference-photos" }))

aw _TenantReferencePhotosPartial (gdzie ActionLink wyrzuca błąd 500) Używam tego

@if (Model.ReferencePhotos == null) 
{ 
    <h3>You haven't uploaded any references! 
     @Ajax.ActionLink("Upload now?", 
      "TenantUploadReference", 
      new AjaxOptions 
      { 
       UpdateTargetId = "tenant-reference-photos", 
       InsertionMode = InsertionMode.Replace, 
       HttpMethod = "GET", 
       LoadingElementId = "ajax-loader" 
      })</h3> 

Może być również przydatna wiedzieć, że inne partials on the strona działa zgodnie z oczekiwaniami, więc nie sądzę, że jest to problem z brakującymi skryptami. Nie wiem, dlaczego tak się dzieje - rozwiązanie byłoby bardzo cenne.

+0

Uważam za interesujące, że twoja akcja GET nigdy nie zwróci wartości null dla Model.ReferencePhotos, ale nadal testujesz na wartość zerową w widoku. Co dzieje się w innym miejscu w widoku? I czy na pewno metoda get nie próbuje po prostu/catch i return View() z Model = null? –

+0

Otrzymałem wyjątek NullReferenceException w GET, a po zbadaniu przeczytałem, że przy użyciu zerowych operatorów koalescencyjnych można temu zaradzić w tego typu sytuacjach. Czy przed skorzystaniem z operatora muszę wykonać test zerowy? Inna wyświetli zdjęcia referencyjne, jeśli użytkownik je posiada, jeśli tego nie zrobi (jeśli) aplikacja wyświetli użytkownikowi ActionLink. Aby ponownie potwierdzić, właśnie przeszedłem przez GET z debuggerem, Model nie ma wartości null i zwracana jest PartialView. – MattSull

+0

Przepraszam, że właśnie zdałem sobie sprawę z tego, co masz na myśli, to ma sens - o tym, że nigdy nie zwrócisz wartości zerowej i wciąż testujesz ją w widoku. Powodem, dla którego używałem operatora w GET, było radzenie sobie z wyjątkiem NullReferenceException. – MattSull

Odpowiedz

4

Rozwiązałem problem. Wracałem currentTenant.ReferencePhotos.ToList(), który rzucił ArgumentNullException. Teraz wracam tylko currentTenant, a GET działa zgodnie z oczekiwaniami.

+1

cieszę się, że jest naprawiony, jednak dwie rzeczy. nie powinieneś mieć sprawdzeń dla 'currentTenant.ReferencePhotos == null' - standardem jest" nowa "ta lista (lub jakakolwiek lista) w konstruktorze obiektów. Po drugie, powinieneś włączyć obsługę Elmah w swojej aplikacji internetowej; to zarejestruje każde 500 błędów i najprawdopodobniej spowodowałoby to błąd bardzo oczywisty (nie powinieneś debugować tych błędów od strony przeglądarki) – wal

+0

Dzięki za radę. ReferencePhotos to ICollecion (najpierw używam kodu), czy można to zrobić w konstruktorze obiektów w ten sam sposób, w jaki może to zrobić lista? Wcześniej czytałem o elmah, dzięki za przypomnienie, dopilnuję, aby to włączyć. – MattSull

+0

tak, jeśli jest to "ICollection", w swoim kodzie można po prostu przejść 'ReferencePhotos = nowa lista ();' ponieważ lista implementuje 'ICollection' – wal

Powiązane problemy