Ошибка в MVC: ссылка на объект не указывает на экземпляр объекта

Я близок к тому, чтобы отказаться от этого приложения mvc на сегодня!!

Я следую учебнику MVC Music Store, и я застрял на странице 54.

это ошибка, я получаю:

6 ответов


тут Album есть ArtistId так как в этой строке вы вызываете Model.ArtistId и если Album не имеет этого свойства, на нем вы получите исключение нулевой ссылки. Это потому, что модель является сокращением для объекта, который строго типизирован для вашего представления, который, оказывается,Album в вашем случае.

в приведенном выше коде нет места, где вы устанавливаете ViewData["художники"]. Вы устанавливаете это где угодно, так как это может быть вашей проблемой тоже.

редактировать

установите ViewData в действии, и он должен работать:

public ActionResult Edit(int id)
{
     var viewModel = new StoreManagerViewModel
     {
         Album = storeDB.Albums.SingleOrDefault(a => a.AlbumId == id),
         Genres = storeDB.Genres.ToList(),
         Artists = storeDB.Artists.ToList()
     };

     ViewData["Artists"] = storeDB.Artists.ToList();
     ViewData["Genres"] = storeDB.Genres.ToList();

     return View(viewModel);
 }

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

public class StoreManagerViewModel
{
    public Album Album { get; set; }
    public int? SelectedArtistId { get; set; }
    public List<Artist> Artists { get; set; }
    public int? SelectedGenreId { get; set; }
    public List<Genre> Genres { get; set; }
}

затем в Edit.aspx вместо:

<%: Html.EditorFor(model => model.Album,
    new { Artists = Model.Artists, Genres = Model.Genres }) %>

вы могли бы просто:

<%: Html.EditorForModel() %>

и в вашем редакторе шаблона ~/Views/Home/EditorTemplates/Album.ascx:

<%@ Import Namespace ="MvcMovies1" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMovies1.Models.Album>" %>

<p>
    <%: Html.LabelFor(model => model.Title) %>
    <%: Html.TextAreaFor(model => model.Title) %>
    <%: Html.ValidationMessageFor(model => model.Title) %>
</p>

<p>
    <%: Html.LabelFor(model => model.Price) %>
    <%: Html.TextAreaFor(model => model.Price) %>
    <%: Html.ValidationMessageFor(model => model.Price) %>
</p>

<p>
    <%: Html.LabelFor(model => model.AlbumArtUrl) %>
    <%: Html.TextAreaFor(model => model.AlbumArtUrl) %>
    <%: Html.ValidationMessageFor(model => model.AlbumArtUrl) %>
</p>

и в вашем редакторе шаблона ~/Views/Home/EditorTemplates/StoreManagerViewModel:

<%@ Import Namespace ="MvcMovies1" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMovies1.ViewModels.StoreManagerViewModel>" %>

<%: Html.EditorFor(model => model.Album) %>

<p>
    <%: Html.LabelFor(model => model.SelectedArtistId) %>
    <%: Html.DropDownListFor(model => model.SelectedArtistId, new SelectList(Model.Artists, "ArtistId", "Name")) %>
</p>

<p>
    <%: Html.LabelFor(model => model.SelectedGenreId) %>
    <%: Html.DropDownListFor(model => model.SelectedGenreId, new SelectList(Model.Genres, "GenreId", "Name")) %>
</p>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

вы пробовали кастинг в список и список вместо IEnumerable?


u r просто не установка ViewData["Artists"] и ViewData["genres"] Как я вижу из вашего метода действия.

убедитесь, что вы устанавливаете эти значения где-то во время жизни запроса, если вы хотите использовать их в ur view


была такая же ошибка при попытке запустить миграцию (update-database). имел 2 проекта, а именно ViewProject и DBcontextProject.

моя проблема заключалась в том, что я сделал ViewProject стартовым проектом и запустил миграцию на DBcontextProject.

решение было сделать DBcontextProject запуска проекта и выполнения миграции на DBcontextProject.


:

ссылка на объект не указывает на экземпляр объекта

устранение:

pubblic ActionResult yourDetails()
{
     List<YourEntityName> PropertyName= new List<YourEntityName>();
     list = db.PropertyName.ToList();
     return View(list);
}

YourEntityName означает Ваше имя таблицы i.e PassengerDetial

PropertyName означает ваш класс pubblic свойство i.e PassengerDetails

pubblic Class PassengerDetailContext : DbContext 
{
  pubblic DbSet<PassengerDetail>  passegerDetails {get;set;}
}

List<PassengerDetail> passegerDetails = new List<PassengerDetail>();
list = db.passegerDetails.ToList();
return View(list);