6

をクリックすると、500 内部サーバー エラーが発生しますAjax.ActionLink。いくつかのパーシャルで構成されたプロファイル ページがあります。各パーシャルはサーバーに対して Ajax 呼び出しを行い、その特定のパーシャルに関連するユーザー情報を編集できるようにします。

上記の機能を備えた3つのパーシャルを実装しましたが、正常に機能します。私が今取り組んでいるものは、最初にアップロードされた画像のリストを表示する必要があります.ユーザーが画像をアップロードしていない場合、Ajax.ActionLink前述の画像が表示されます.

リンクをクリックすると、Chrome で次のように表示されます。

ここに画像の説明を入力

GET と 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();
        }
    }

GET にブレーク ポイントを指定してデバッガーをステップ実行すると、デバッガーがActionResultヒットreturn PartialViewし、例外はスローされません。

_TenantUploadReferencePartialが使用する

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

そして_TenantReferencePhotosPartialActionLink500エラーがスローされる場所)でこれを使用します

@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>

ページ上の他のパーシャルが期待どおりに機能することを知ることも役立つ場合があるため、スクリプトが欠落しているという問題ではないと思います。なぜこれが起こっているのか、私は途方に暮れています - 解決策をいただければ幸いです。

4

1 に答える 1

4

私は問題を解決しました。currentTenant.ReferencePhotos.ToList().を投げて戻ってきましたArgumentNullException。今、私はちょうど を返してcurrentTenantいます.GETは期待どおりに機能しています.

于 2013-03-23T15:52:35.737 に答える