MVC视图模型返回NULL

时间:2019-05-10 04:56:29

标签: asp.net-mvc entity-framework model-view-controller

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

我只是在创建一个简单的视图,该视图带来了一个包含一些基本SQL SP结果的模型,但作为返回,该模型返回了null,因此出现“ Object refrence”错误。该错误不足为奇,因为显然如果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 Function Import

感谢您的帮助,已经进行了一段时间的调试。

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

1 个答案:

答案 0 :(得分:0)

第一个调用将是调试您自己的代码并查看发生了什么。 停止像这样做一个班轮:

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);

现在您可以在颜色行上放置一个断点,并查看回购返回的内容。

您可以进入回购代码以查看进展。您也可以使用代码来做到这一点,可以在return语句上放置一个断点,然后在此处停止时再次进入代码,但是,如果您远离那些讨厌的代码,会容易得多。