我正在使用所涉及的实体框架创建第一个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
感谢您的帮助,已经进行了一段时间的调试。
我在理论上的一个担心是,实体框架返回的是ObjectResult而不是IEnumerable,但这会导致该转换尝试出错。不幸的是,我无法获得控制器级别的代码来达到断点,因此无法确认。
答案 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语句上放置一个断点,然后在此处停止时再次进入代码,但是,如果您远离那些讨厌的代码,会容易得多。