У меня есть частичный вид, который имеет 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?
Может ли кто-нибудь обнаружить, почему я получаю ошибку выше?
Оставляя свой код, как есть, я думаю, что я должен иметь GET ActionResult, который возвращает частичное _TenantUploadReferencePartial? Правильно ли это звучит? – MattSull
Да, у вас есть право - вместо того, чтобы сменить «HttpMethod'», вы можете удалить атрибут «HttpPost». Но, на мой взгляд, вы должны разделить два случая. Первое действие, когда вы хотите только возврат, и он работает с GET. Второе действие для POST, поддерживающее логику загрузки. –
Я сделал то, что я описал выше, но теперь у меня ошибка 500. Когда я вхожу в GET ActionResult в режиме отладки, он возвращает Return PartialView, но фактически не обновляет целевой DIV, и я получаю ошибку 500 в клиенте. Я буду продолжать изучать его. – MattSull