2013-03-20 4 views
0

У меня есть частичный вид, который имеет Ajax.ActionLink, который при нажатии должен заменить вид (целевой DIV) на другой частичный вид, который позволяет пользователю загружать изображение. У меня есть несколько из них на странице, которые работают, я просто не могу понять, почему я продолжаю получать 404 для этого конкретного.Ajax.ActionLink дает 404 не найдена ошибка

Вот что у меня есть:

MyProfile.cshtml содержит все парциальные (арендатор-ссылки-фото является изменение целевой ДИВ):

<div class="row-fluid"> 
    <div class="span6 well-border" id="tenant-reference-photos"> 
     @Html.Partial("~/Views/Tenants/_TenantReferencePhotosPartial.cshtml", Model) 
    </div> 
    <div class="span6 well-border" id="tenant-viewings"> 
     @Html.Partial("~/Views/Tenants/_TenantViewingsPartial.cshtml", Model) 
    </div> 
</div> 

_TenantReferencePhotosPartial.cshtml (ActionLink давая 404 здесь):

<div class="row-fluid"> 
@if (Model.ReferencePhotos == null) 
{ 
    <h3>You haven't uploaded any references! 
    @Ajax.ActionLink("Upload now?", // on click 404 returned in developer tools in Chrome 
     "UploadReference", 
     new AjaxOptions 
     { 
      UpdateTargetId = "tenant-reference-photos", 
      InsertionMode = InsertionMode.Replace, 
      HttpMethod = "GET", 
      LoadingElementId = "ajax-loader" 
     }) 
    </h3> 
} 
</div> 

Код ниже возвращает выше частичный:

[HttpGet] 
public ActionResult TenantReferencePhotos() 
{ 
    var currentTenant = tenantRepository.GetLoggedInTenant(); 
    return PartialView("_TenantReferencePhotosPartial", currentTenant.ReferencePhotos.ToList()); 
} 

Следующая ActionResult является то, что не вызывается в Ajax.ActionLink и давая ошибку 404:

[HttpPost] 
public ActionResult UploadReference(HttpPostedFileBase file, Tenant tenant) 
{ 
    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(); 
    } 
} 

Для полноты, вот частичный вид где изображение может быть загружено:

<div> 
@using (Ajax.BeginForm("UploadReference", "Tenants", FormMethod.Post, 
    new AjaxOptions 
    { 
     InsertionMode = InsertionMode.Replace, 
     HttpMethod = "POST", 
     UpdateTargetId = "tenant-reference-photos" 
    })) 
{ 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken() 
    <div> 
     Select a file: 
     <input type="file" name="file" /> 
     <input type="submit" value="UploadReference" /> 
    </div> 
} 
</div> 

Все сценарии в MyProfile.cshtml. Нужно ли включать unobtrusive-ajax.js в качестве скрипта во все частичные представления, даже если на него ссылаются в Layout.cshtml и/или MyProfile.cshmtml?

Может ли кто-нибудь обнаружить, почему я получаю ошибку выше?

ответ

2

В вашем коде UploadReference украшен атрибутом HttpPost, поэтому он доступен только при выполнении POST. По вашему мнению, вы установили HttpMethod в GET. При изменении его POST он должен работать:

@Ajax.ActionLink("Upload now?", 
    "UploadReference", 
    new AjaxOptions 
    { 
     UpdateTargetId = "tenant-reference-photos", 
     InsertionMode = InsertionMode.Replace, 
     HttpMethod = "POST", 
     LoadingElementId = "ajax-loader" 
    }) 
+0

Оставляя свой код, как есть, я думаю, что я должен иметь GET ActionResult, который возвращает частичное _TenantUploadReferencePartial? Правильно ли это звучит? – MattSull

+0

Да, у вас есть право - вместо того, чтобы сменить «HttpMethod'», вы можете удалить атрибут «HttpPost». Но, на мой взгляд, вы должны разделить два случая. Первое действие, когда вы хотите только возврат, и он работает с GET. Второе действие для POST, поддерживающее логику загрузки. –

+0

Я сделал то, что я описал выше, но теперь у меня ошибка 500. Когда я вхожу в GET ActionResult в режиме отладки, он возвращает Return PartialView, но фактически не обновляет целевой DIV, и я получаю ошибку 500 в клиенте. Я буду продолжать изучать его. – MattSull

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