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:
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.
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? –
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
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