Получение данных в ViewModel в MVC - PullRequest
1 голос
/ 20 сентября 2019

Это моя первая попытка реализации MVC, и я застрял, пытаясь устранить ошибку ссылки на объект.Данные не поступают из модели в модель представления, и я не могу понять, почему.Я пытаюсь передать данные на страницу Home (Index), но получаю «Ссылка на объект не установлена ​​на экземпляр объекта».ошибка, потому что @model не заполняется.Я не могу понять, где разрывается цепь.Я попытался добавить соответствующие биты кода ниже.

Модель - Model / blogpost.cs, и EF создал соответствующую таблицу.Я добавил одну строку данных для тестирования.

 public class BlogPosts
{
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string ShortPost { get; set; }
    [Required]
    public string Post { get; set; }
    [Required]
    public string Tags { get; set; }
    [Required]
    public DateTime Updated { get; set; }
}

контроллером является Controller / HomeController.cs,

        public ActionResult Index()
    {
        var viewModel = new IndexViewModel();
        return View("Index",viewModel);
    }

модель представления - View / IndexViewModel.cs

 public class IndexViewModel
{
    public BlogPosts Blog { get; set; }
}

, который используется View / Index.cshtml.Вот фрагмент HTML, пятая строка снизу - это первое использование @model, и это NULL-объект:

<!DOCTYPE html>
@model congresssucks_asp.ViewModels.IndexViewModel
@{
ViewBag.Title = "BlogPosts";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" type="text/css" href="~/Content/normalize.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/grid.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/style.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/queries.css" />
    <link href="https://fonts.googleapis.com/css?family=Lato:100,300,300i,400" rel="stylesheet">
    <meta charset="utf-8" />
    <title>Congress Sucks!</title>
</head>
<body>
    <section class="section-blog js-section-blog" id="latest">
        <div class="row">
            <h2>Most Recent Posts</h2>
        </div>
        <div class="row">
            <div class="col span-1-of-4 box">
                <div class="blog-box">
                    <h3>@Model.Blog.Title </h3>
                    <div class="blog-date">@Model.Blog.Updated</div>
                    <p>
                        @Model.Blog.ShortPost
                    </p>

Это приводит к этой ошибке:

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 25:             <div class="col span-1-of-4 box">
Line 26:                 <div class="blog-box">
Line 27:                     <h3>@Model.Blog.Title </h3>
Line 28:                     <div class="blog-date">@Model.Blog.Updated</div>
Line 29:                     <p>

Я установил точку останова на контроллере, и объект viewmodel выглядит как нулевой.

Точка останова

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Вы инициализируете только модель IndexViewModel, но BlogPosts не инициализируется, см. Пример кода ниже, и это поможет вам.

public ActionResult Index()
{
    var viewModel = new IndexViewModel();
    //viewModel.Blog <--- This object is null
    viewModel.Blog = new BlogPosts(); //Get data from database or initialize an empty object(Ex: viewModel.Blog = GetPostData())
    //viewModel.Blog <--- Then this object initialize as an empty object

    return View("Index",viewModel);
}
0 голосов
/ 21 сентября 2019
#Model class
public class BlogPosts
{
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string ShortPost { get; set; }
    [Required]
    public string Post { get; set; }
    [Required]
    public string Tags { get; set; }
    [Required]
    public DateTime Updated { get; set; }
}

#the controller is Controller/HomeController.cs
public ActionResult Index()
{
    var viewModel = new IndexViewModel();
    viewModel.Blog = new  BlogPosts();
    return View("Index",viewModel);
}

#the view model is View/IndexViewModel.cs
public class IndexViewModel
{
    public BlogPosts Blog { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...