您好我在HomeController.cs中有以下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MovieApp.Models;
namespace MovieApp.Controllers
{
public class HomeController : Controller
{
private MoviesDBEntities _db = new MoviesDBEntities();
//
// GET: /Home/
public ActionResult Index()
{
return View(_db.MovieSet.ToList());
}
//
// GET: /Home/Details/5
public ActionResult Details(int id)
{
return View(_db.MovieSet);
}
//
// GET: /Home/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Home/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id")] Movie movieToCreate)
{
if (!ModelState.IsValid)
return View();
_db.AddToMovieSet(movieToCreate);
_db.SaveChanges();
return RedirectToAction("Index");
}
//
// GET: /Home/Edit/5
public ActionResult Edit(int id)
{
var movieToEdit = (from m in _db.MovieSet
where m.Id == id
select m).First();
return View(movieToEdit);
}
//
// POST: /Home/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Movie movieToEdit)
{
var originalMovie = (from m in _db.MovieSet
where m.Id == movieToEdit.Id
select m).First();
if (!ModelState.IsValid)
return View(originalMovie);
_db.ApplyPropertyChanges(originalMovie.EntityKey.EntitySetName, movieToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
}
}
我使用以下代码创建了一个Details视图:
<fieldset>
<legend>Fields</legend>
<p>
Id:
<%= Html.Encode(Model.Id) %>
</p>
<p>
Title:
<%= Html.Encode(Model.Title) %>
</p>
<p>
Director:
<%= Html.Encode(Model.Director) %>
</p>
<p>
DateReleased:
<%= Html.Encode(String.Format("{0:g}", Model.DateReleased)) %>
</p>
</fieldset>
然而,当我运行它时,我得到一个错误,说对象引用未设置为此行上的对象实例:<%= Html.Encode(Model.Id) %>
我假设我在HomeController.cs中缺少某些内容详情ActionResult。但是什么?
感谢。
编辑2:
将其添加到代码中:
public ActionResult Details(int id)
{
//return View();
var movieToView = (from m in _db.MovieSet
where m.Id == id
select m).First();
return View(movieToView);
解决了这个问题。但为什么我需要指定这个?返回View()不只是显示它?为什么?
答案 0 :(得分:0)
您的_db.MovieSet属性似乎返回null值。我会在控制器详细信息方法中在调试器中放置一个断点来检查它。
编辑:看着你的代码,它出现在其他方法中,你的_db.MovieSet属性是一个集合,而不是一个对象。我只是猜测,但由于你的详细信息动作有一个id参数,我认为使用linq从该集合返回一个对象会有所帮助。有点像:
return View(_db.MovieSet.Single(m => m.Id == id));
将此值分配给变量可能是一个想法,并在传递给视图之前检查空值以捕获任何空值异常并优雅地处理:
var movieSet = _db.MovieSet.SingleOrDefault(m => m.Id == id);
if(moviesSet != null)
return View(movieSet);
else
return View("Error");
确保您的详细视图具有与之关联的正确模型。
答案 1 :(得分:0)
看不到任何我不是专家,看着公共ActionResult编辑(电影movieToEdit),它看起来似乎是一个无效回归的完美地点。
答案 2 :(得分:0)
这为我提供了答案,显然模型中的命名约定是不正确的。使用edmx实体模型名称。例如_db。电影 .ToList()该线程还包含源代码。 http://forums.asp.net/post/4051978.aspx