【问题标题】:ASP.NET Core - MVC - Model variable in view - null exceptionASP.NET Core - MVC - 视图中的模型变量 - 空异常
【发布时间】:2020-10-17 11:45:33
【问题描述】:

为了学习 ASP.NET Core MVC,我做了一个简单的项目,并尝试将在控制器中创建的模型实例传递给视图。

控制器代码 - 我创建一个简单的列表,然后将它传递给视图,明确说明哪个视图

public class TableController : Controller
    {
        public IActionResult Index()
        {
            var modelData = new List<string> {"A", "B"};

            ViewBag.Title = "Tables";
            
            return View("/Pages/Table.cshtml", modelData);
        }
    }

查看代码

@page
@model List<string>

    <div class="text-center">
        <h1 class="display-4">@ViewBag.Title</h1>

        @if (Model == null)
        {
            <p>There is no data to be displayed</p>
        }
        else
        {
            <ul>
                @foreach (string str in Model)
                {
                    <li>@str</li>
                }
            </ul>
        }
    </div>

当我在控制器中设置断点时,我作为模型参数传入的对象不为空:

但是,当我进入视图代码时,我得到了这个:

我查看了其他一些“模型为空”的帖子,但它们是由于在 View() 模型参数中传递的内容与 @ 给出的视图中的预期内容之间不匹配类型模型声明。

这可能很简单,但我不确定我哪里出错了?

【问题讨论】:

  • 也许可以尝试使用模型的实际自定义类,其中 List 是模型的属性,而不是直接使用。这就是 MVC 应该如何工作Docs on adding a MVC model

标签: asp.net-core model-view-controller nullreferenceexception


【解决方案1】:

我有同样的例外,解决方案是删除 Index.cshtml 中的@page,然后 Boom,一切都在那里。我花了 5-6 个小时来“解决”这个异常,但迟到总比没有好。

【讨论】:

    【解决方案2】:

    在asp.net MVC中,View不代表Razor Page。可以使用View page,并在Views中添加一个Table文件夹。然后在其中添加一个Index.cshtml(Razor View Page)。

    这是一个演示:

    Controller(return View() inIndex action会在Views/Table(Views/ControllerName)中找到一个Index.cshtml):

    public class TableController : Controller
        {
            public IActionResult Index()
            {
                var modelData = new List<string> { "A", "B" };
    
                ViewBag.Title = "Tables";
    
                return View(modelData);
            }
        }
    

    查看(不要使用@page,它在Razor Page中使用):

    @model List<string>
    @{
        ViewData["Title"] = "Table_Index";
    }
    <div class="text-center">
        <h1 class="display-4">@ViewBag.Title</h1>
    
        @if (Model == null)
        {
            <p>There is no data to be displayed</p>
        }
        else
        {
            <ul>
                @foreach (string str in Model)
                {
                    <li>@str</li>
                }
            </ul>
        }
    </div>
    

    Views 文件夹结构(每个文件夹表示一个控制器,Shared 除外):

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2018-08-13
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多