简体   繁体   中英

How to fix System.NullReferenceException' occurred in App_Web_xxxx.dll in asp.net mvc?

This is a part of my view code for Index action of Manage Controller.

<div class="mngimg">
    @using (Html.BeginForm("UploadPhoto", "Manage", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <div class="btn btn-default browseimg">
            <input type="file" name="file" id="files" onchange="this.form.submit()" />
        </div>
        <div class="btn btn-default browseimg">
            @Html.ActionLink("Remove Photo", "RemovePhoto", "Manage")
        </div>
    }
</div>
                </div>
            }
        </dd>
<dt>Password:</dt>
<dd>
    [
    @if (Model.HasPassword) <!-- Here is my error. The Model is null -->
            {
        @Html.ActionLink("Change your password", "ChangePassword")
    }
    else
    {
        @Html.ActionLink("Create", "SetPassword")
    }
    ]
</dd>

Whenever I open this page and click "Remove Photo" I keep getting an error saying that An exception of type 'System.NullReferenceException' occurred in App_Web_ckoryptg.dll but was not handled in user code . I tried debugging, but I am unable to figure out why my Model.HasPassword is becoming null. Here is my RemovePhoto Action from Manage Controller.

[HttpPost]
public async Task<ActionResult> UploadPhoto(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        var user = await GetCurrentUserAsync();
        var userId = user.Id;
        var fileExt = Path.GetExtension(file.FileName);
        var fnm = userId + ".png";
        if (fileExt.ToLower().EndsWith(".png") || fileExt.ToLower().EndsWith(".jpg") || fileExt.ToLower().EndsWith(".gif"))// Important for security if saving in webroot
        {
            var filePath = HostingEnvironment.MapPath("~/Content/Images/") + fnm;
            var directory = new DirectoryInfo(HostingEnvironment.MapPath("~/Content/Images/"));
            if (directory.Exists == false)
            {
                directory.Create();
            }
            ViewBag.FilePath = filePath.ToString();
            file.SaveAs(filePath);
            return RedirectToAction("Index", new { Message = ManageMessageId.PhotoUploadSuccess });
        }
        else
        {
            return RedirectToAction("Index", new { Message = ManageMessageId.FileExtensionError });
        }
    }
    return RedirectToAction("Index", new { Message = ManageMessageId.Error });// PRG
}

private async Task<ApplicationUser> GetCurrentUserAsync()
{
    return await UserManager.FindByIdAsync(User.Identity.GetUserId());
}

I opened a default MVC project that comes with visual studio and I added these extra things that I followed from this tutorial ASP.NET upload images . How do I resolve this?

Edit: This is my RemovePhoto action.

public ActionResult RemovePhoto()
        {
            string file = "~/Content/Images/" + User.Identity.GetUserId() + ".png";
            if(System.IO.File.Exists(Server.MapPath(file)))
                System.IO.File.Delete(Server.MapPath(file));
            return View("Index");
        }

Just Redirect back to your Index action. That way you don't have to instantiate your Index model in your RemovePhoto action. Can read more about this pattern here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM