这与NullReferanceException问题不同,因为我们正在处理一个由关注点分隔的项目,使它在某些方面有所不同 - 因为之前的答案是处理一个项目,我们正在处理3个不同的项目和命名空间。
我一直这样:
Line 41: <th></th>
Line 42: </tr>
Line 43: @foreach (var item in Model)
Line 44: {
Line 45: <tr>
说明:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。
这是我的代码:
DVD.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System.Web;
using System.Data.Entity;
namespace DVDStore.Data.Models
{
public class DVD
{
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public decimal Price { get; set; }
//public byte[] Picture { get; set; }
// Foreign Key
public virtual Ratings RatingsID { get; set; }
// Foreign Key
public virtual Genres GenresID { get; set; }
// Foreign Key
public virtual SalesInfo SalesInfoID { get; set; }
//Foreign Key
public virtual ICollection<Actor> Actors { get; set; }
}
public class MovieDBContext : DbContext
{
public DbSet<DVD> DVDs { get; set; }
}
}
控制器
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using DVDStore.Access.Methods;
namespace DVDStore.WEB.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FindAllDVDs findDVDs = new FindAllDVDs();
return View(findDVDs);
}
}
使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DVDStore.Data.Models;
using System.Data;
using System.Data.Entity;
using System.Net;
using System.Web.Mvc;
namespace DVDStore.Access.Methods
{
public class FindAllDVDs
{
//List<FindAllDVDs> dVDs = new List<FindAllDVDs>();
private DVDStoreContext db = new DVDStoreContext();
public dynamic ViewBag { get; }
public void FindAllDVD(string DVDTitles, string searchString)
{
var FindDVDS = new List<string>();
var DVDQuery = from d in db.DVD
orderby d.Title
select d.Title;
FindDVDS.AddRange(DVDQuery.Distinct());
ViewBag.DVDTitles = new SelectList(FindDVDS);
var dvds = from dvd in db.DVD
select dvd;
if (!String.IsNullOrEmpty(searchString))
{
dvds = dvds.Where(s => s.Title.Contains(searchString));
}
if (!String.IsNullOrEmpty(DVDTitles))
{
dvds = dvds.Where(x => x.Title == DVDTitles);
}
}
}
}
最后 index.schtml 我遇到了问题
一切都编译w / 0错误btw
@*@{
Layout = "~/Views/Shared/_Layout.cshtml";
}*@
@model IEnumerable<DVDStore.Data.Models.DVD>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p></p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "DVD", FormMethod.Get))
{
<p>
Title: @Html.TextBox("SearchString") <br />
<input type="submit" value="Filter" />
</p>
}
}
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
</tr>
}
</table>
</table>
答案 0 :(得分:1)
您的视图需要DVD
类型模型的集合。
@model IEnumerable<DVDStore.Data.Models.DVD>
但是,在Controller中,您传递的是FindAllDVDs
。
FindAllDVDs findDVDs = new FindAllDVDs();
return View(findDVDs);
您应该传递DVD
个对象的列表。
更新:
最快捷的方法是从方法中返回DVD对象列表。
public IEnumerable<DVDStore.Data.Models.DVD> FindAllDVD(string DVDTitles, string searchString)
并返回Dvds列表。
然后在你的控制器中,你可以这样做:
FindAllDVDs findDVDs = new FindAllDVDs();
IEnumerable<Dvd> dvds = findDVDs.FindAllDVD(<DVDTitles>, <searchString>);
return View(dvds);
但是,我不建议采用这种方法。您不希望将数据模型用作视图模型。我宁愿创建一个单独的DVD类作为View的模型,然后将Data模型映射到此View Model。
答案 1 :(得分:1)
您需要更改FindAllDVD
方法,使其具有:
return dvds;
作为最后一行。这可能意味着将签名更改为:
public IEnumerable<DVD> FindAllDVD(string DVDTitles, string searchString)
然后,您需要传递findDVDs
的结果,而不是将findDVDs.FindAllDVD
传递给视图:
FindAllDVDs findDVDs = new FindAllDVDs();
return View(findDVDs.FindAllDVD("", ""));
这样,您的Model
将使用DVDs
的集合,而不是现在的FindAllDVDs
类的单个实例。
答案 2 :(得分:1)
在FindAllDVDs
内,您在构造函数中设置了the List<FindAllDVDs> dVDs = new List<FindAllDVDs>();
。
你可以像刚才那样调用构造函数(记得取消注释dvds属性,如下所示:
public List<FindAllDVDs> dVDs = new List<FindAllDVDs>();
并在构造函数中设置值,如下所示:
dVDs = dvds;
也许你需要做一些演员,比如:
dVDs = dvds.toList();
,并传递FindAllDVDs
内的值,如下所示:
FindAllDVDs findDVDs = new FindAllDVDs("","");
return View(findDVDs.dvds);