c# - @foreach(模型中的var项)

时间:2018-03-23 01:44:31

标签: c# database model-view-controller model

这与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>

3 个答案:

答案 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);