首页 > 解决方案 > MVC 视图模型返回 NULL

问题描述

我正在使用所涉及的实体框架创建我的第一个 MVC 应用程序,但遇到了一些奇怪的问题。

我只是创建一个简单的视图,它带来了一个包含一些基本 SQL SP 结果的模型,但作为返回视图,模型返回 null,因此给了我一个“对象引用”错误。该错误不足为奇,因为显然如果 Model 返回 null,则没有对象,但我可以毫无问题地在 SSMS 中执行 SP 并获得预期的返回值。

如果您想查看,这是我的代码:

控制器

 public class ColorController : Controller
{

    public ActionResult Index()
    {
        ColorsMainEntities empdb = new ColorsMainEntities();

        return View(empdb.GetColors(0,""));
    }

    [HttpPost]
    public ActionResult Index(string customerName)
    {
        ColorsMainEntities empdb = new ColorsMainEntities();
        return View(empdb.GetColors(0,""));
    }
}

看法

@model IEnumerable<Colors_Test.M_Colors>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Colors</title>
</head>
<body>
    @using (Html.BeginForm("Index", "Color", FormMethod.Post))
    {
        <span>Customer Name:</span> @Html.TextBox("CustomerName")
        <input type="submit" value="Search" />
        <br />
       <br />
       <table cellpadding="0" cellspacing="0">
            <tr>
                <th>ID</th>
                <th>Color</th>
                <th>Category</th>
                <th>Type</th>
                <th>RGBA</th>
                <th>Hex</th>
            </tr>
            @foreach (M_Colors color in Model)
            {
        <tr>
            <td>@color.ColorID</td>
            <td>@color.Color</td>
            <td>@color.Category</td>
            <td>@color.Type</td>
            <td>@color.RGBA</td>
            <td>@color.Hex</td>
        </tr>
            }
        </table>
    }
</body>
</html>

SP

ALTER PROCEDURE [dbo].[GetColors] (@pnColorID INT = 0, @pcColor VARCHAR(999) = '')
AS
BEGIN
    IF(@pcColor <> '')
    BEGIN
        SELECT * FROM M_Colors WHERE Color LIKE '%' + @pcColor + '%'
    END
    ELSE
    BEGIN
        SELECT * FROM M_Colors
    END

END

EF 函数导入

任何帮助表示赞赏,已经进行了很长一段时间的调试。

我对理论的一个担忧是实体框架返回一个 ObjectResult 而不是 IEnumerable ,但这会导致该转换尝试出错。不幸的是,我无法让我的控制器级别代码达到断点,因此我无法确认。

标签: asp.net-mvcentity-frameworkmodel-view-controller

解决方案


第一个电话是调试你自己的代码,看看发生了什么。停止像这样做一个衬里:

return View(empdb.GetColors(0,""));

相反,像这样分开代码:

var colors = empdb.GetColors(0,"");

//some extra checks here, decide what you do if there are no colors returns, 
//maybe return an empty list for example so you don't get null errors any more.

return View(colors);

现在您可以在颜色行上放置一个断点,然后查看您的存储库返回的内容。

您可以进入 repo 代码以查看发生了什么。你也可以用你的代码来做这件事,你可以在 return 语句上放一个断点,当你停在那里时,再次进入代码,但是如果你远离那些讨厌的一个衬里,那就容易多了。


推荐阅读