-1

我有这个我无法修复的基本错误...对象引用未设置为对象的实例

我正在使用带有 ef 的 asp.net mvc4

我的控制器

 public class PostController : Controller
    {
        private UsersContext db = new UsersContext();

        public ActionResult Index()
        {
            return View(db.Posts.ToList());
        }

        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(FormCollection values)
        {
            var post = new Post();
            TryUpdateModel(post);

            if(ModelState.IsValid)
            {
                var context = new UsersContext();
                var username = User.Identity.Name;
                var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
                var userid = user.UserId;
                // var firstname = user.FirstName;

                post.UserId = userid;
                post.Date = DateTime.Now;

                db.Posts.Add(post);
                db.SaveChanges();
            }
            return View("Index");
        }

我的观点:

@model IEnumerable<MyProject.Models.Post>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Content)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date)
        </th>
        <th></th>
    </tr>

   @foreach (var item in Model) { //**line with error**

    <tr>
        <td>
                @Html.DisplayFor(modelItem => item.Content)
        </td>
        <td>
                @Html.DisplayFor(modelItem => item.Date)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.PostId }) |
            @Html.ActionLink("Details", "Details", new { id=item.PostId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.PostId })
        </td>
    </tr>
}
</table>

谢谢你的帮助

4

2 回答 2

8

在控制器中的 GET 操作之后,您忘记将模型发送到视图。你的return陈述应该是:

    public ActionResult Create()
    {
        return View("Create", new Post());
    }

您必须为模型提供一些东西,否则它将null在视图中。

您的 POST 方法可能也会遇到同样的问题,它返回:

return View("Index");

而不是这样做,您可能应该只重定向到 Index 操作:

return RedirectToAction("Index");

此外,您只想在成功时执行此操作 - 如果模型状态无效,您可能希望返回创建屏幕以显示错误。因此,您的发布操作最终会是这样的:

   [HttpPost]
    public ActionResult Create(FormCollection values)
    {
        var post = new Post();
        TryUpdateModel(post);

        if(ModelState.IsValid)
        {
            var context = new UsersContext();
            var username = User.Identity.Name;
            var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
            var userid = user.UserId;
            // var firstname = user.FirstName;

            post.UserId = userid;
            post.Date = DateTime.Now;

            db.Posts.Add(post);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        return View("Create", post);
    }
于 2012-12-13T17:28:41.990 回答
0

anObject reference not set to an instance of an object表示您正试图访问一个对象的属性或方法,即null.

于 2012-12-13T17:28:57.990 回答