2013-06-03 39 views
1

我正在做一個ASP.NET MVC教程。我創建了晚餐控制器以及Dinner Controller的索引視圖。但是,我的晚餐索引視圖出現了錯誤。以下代碼中的每個循環都會出現該錯誤。但晚餐索引視圖默認生成。我沒有改變任何事情。System.NullReferenceException-NerdDinner教程

我的晚餐索引視圖的代碼是

@model IEnumerable<NerdDinner.Models.Dinner> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      Title 
     </th> 
     <th> 
      Latitude 
     </th> 
     <th> 
      Longitude 
     </th> 
     <th> 
      EventDate 
     </th> 
     <th> 
      ContactPhone 
     </th> 
     <th> 
      Address 
     </th> 
     <th> 
      Country 
     </th> 
     <th> 
      HostedBy 
     </th> 
     <th> 
      Description 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) {//Error appears here 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Title) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Latitude) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Longitude) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.EventDate) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.ContactPhone) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Address) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Country) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.HostedBy) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.DinnerID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.DinnerID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.DinnerID }) 
     </td> 
    </tr> 
} 

</table> 

我的晚餐控制器的代碼是

namespace NerdDinner.Controllers 
{ 
    public class DinnerController : Controller 
    { 
     IDinnerRepository _repository; 

     public DinnerController() 
     { 
      _repository = new sqlDinnerRepository(); 
     } 

     public DinnerController(IDinnerRepository repository) 
     { 
      _repository = repository; 
     } 

     // 
     // GET: /Dinner/ 

     public ActionResult Index() 
     { 
      if (Request.IsAjaxRequest()) 
      { 
       var dinners = _repository.FindAllDinners().Where(x => x.EventDate >= DateTime.Now).ToList(); 
       return Json(dinners); 
      } 
      else 
      { 
       return View(); 
      } 
     } 

     // 
     // GET: /Dinner/Details/5 

     public ActionResult Details(int id) 
     { 
      var dinner = _repository.GetDinner(id); 
      return View(dinner); 
     } 

     // 
     // GET: /Dinner/Create 

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

     // 
     // POST: /Dinner/Create 

     [HttpPost] 
     public ActionResult Create(Dinner dinner) 
     { 
      try 
      { 
       // TODO: Add insert logic here 
       _repository.AddDinner(dinner); 
       _repository.Save(); 

       return RedirectToAction("Index"); 
      } 
      catch 
      { 
       return View(dinner); 
      } 
     } 

     // 
     // GET: /Dinner/Edit/5 

     public ActionResult Edit(int id) 
     { 
      var dinner = _repository.GetDinner(id); 
      return View(dinner); 
     } 

     // 
     // POST: /Dinner/Edit/5 

     [HttpPost] 
     public ActionResult Edit(int id, FormCollection collection) 
     { 

      var dinner = _repository.GetDinner(id); 
      try 
      { 
       // TODO: Add update logic here 
       UpdateModel(dinner, collection.ToValueProvider()); 
       _repository.Save(); 
       return RedirectToAction("Index"); 
      } 
      catch 
      { 
       return View(dinner); 
      } 
     } 

     // 
     // POST: /Dinner/Delete/5 

     [HttpPost] 
     public ActionResult Delete(int id) 
     { 
      var dinner = _repository.GetDinner(id); 
      try 
      { 
       // TODO: Add delete logic here 
       _repository.DeleteDinner(dinner); 
       _repository.Save(); 
       return RedirectToAction("Index"); 
      } 
      catch 
      { 
       return View(dinner); 
      } 
     } 
    } 
} 

IDinnerRepository是一個接口和sqlDinnerRepository實現它

IDinnerRepository的代碼

namespace NerdDinner.Models 
    { 
     public interface IDinnerRepository 
     { 
      //Query Methods 
      IQueryable<Dinner> FindAllDinners(); 
      IQueryable<Dinner> FindUpcomingDinners(); 
      Dinner GetDinner(int id); 

      //Insert/Delete 
      void AddDinner(Dinner dinner); 
      void DeleteDinner(Dinner dinner); 

      //Persistence 
      void Save(); 
     } 
    } 

sqlDinnerRepository的代碼是

namespace NerdDinner.Models 
    { 
     public class sqlDinnerRepository: IDinnerRepository 
     { 
      public dbDataContext db; 
      public sqlDinnerRepository() 
      { 
       db = new dbDataContext(); 
      } 

      public IQueryable<Dinner> FindAllDinners() 
      { 
       return db.Dinners; 
      } 

      public IQueryable<Dinner> FindUpcomingDinners() 
      { 
       return from dinner in db.Dinners 
         where dinner.EventDate > DateTime.Now 
         orderby dinner.EventDate 
         select dinner; 
      } 

      public Dinner GetDinner(int id) 
      { 
       return db.Dinners.SingleOrDefault(x => x.DinnerID == id); 
      } 

      public void AddDinner(Dinner dinner) 
      { 
       db.Dinners.InsertOnSubmit(dinner); 
      } 

      public void Save() 
      { 
       db.SubmitChanges(); 
      } 

      public void DeleteDinner(Dinner dinner) 
      { 
       db.Dinners.DeleteOnSubmit(dinner); 
      } 
     } 
    } 

我已經更新了我的數據庫和LINQ數據模型。

回答

0

當您進行常規GET請求時,此操作不會將模型發送到視圖。

public ActionResult Index() 
     { 
      if (Request.IsAjaxRequest()) 
      { 
       var dinners = _repository.FindAllDinners().Where(x => x.EventDate >= DateTime.Now).ToList(); 
       return Json(dinners); 
      } 
      else 
      { 
       return View(); 
      } 
     } 

我不知道爲什麼默認的項目做到這一點,但你可以修復的NRE這樣的:

public ActionResult Index() 
{ 
    var dinners = _repository.FindAllDinners().Where(x => x.EventDate >= DateTime.Now).ToList(); 
    if (Request.IsAjaxRequest()) 
    { 
     return Json(dinners); 
    } 
    else 
    { 
     return View(dinners); 
    } 
} 
+0

是啊,我沒有任何價值傳遞到吃飯的視圖。 – Lucky

1
return View(); 

您沒有將任何模型傳遞給視圖。
因此,Model爲空。