2015-09-19 54 views
0

有一個文件:Opinion.cshtml in Views/Home。如何設置對象的實例?

@model Aquapark.ViewModels.OpinionViewModel 
@{ 
    ViewBag.Title = "Opinia"; 
    Layout = "~/Views/Shared/_StoreLayout.cshtml"; 
} 

<h2>Opinia</h2> 
<div style="margin-top: 20px; line-height: 22px;"> 
    <div class="opinion-box"> 
     @foreach (var opinions in Model.Opinions) 
     { 
      <div class="opinion-box-content"> 
       <div class="opinion-box-content-inside">@opinions.Content</div> 
       <div class="date">@opinions.Date</div> 
      </div> 
      <div class="opinion-author">@opinions.PersonId</div> 
     } 
    </div> 
</div> 

我有文件:OpinionViewModel.cs視圖模型文件夾(創建)。

using Aquapark.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace Aquapark.ViewModels 
{ 
    public class OpinionViewModel 
    { 
     public IEnumerable<Opinion> Opinions { get; set; } 
     public IEnumerable<Person> Authors { get; set; } 
    } 
} 

Person.cs

namespace Aquapark.Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.ComponentModel.DataAnnotations.Schema; 
    using System.Data.Entity.Spatial; 

    [Table("Person")] 
    public partial class Person 
    { 
     [Key] 
     public int PersonId { get; set; } 

     [Required] 
     public long Pesel { get; set; } 

     [Required] 
     [StringLength(30, ErrorMessage = "Imię nie może zawierać więcej niż 30 znaków.")] 
     [Display(Name = "Imię")] 
     public string FirstName { get; set; } 

     [Required] 
     [StringLength(60, ErrorMessage = "Nazwisko nie może zawierać wiecej niż 60 znaków.")] 
     [Display(Name = "Nazwisko")] 
     public string LastName { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     [DisplayFormat(DataFormatString = "{dd/mm/yyyy}", ApplyFormatInEditMode = true)] 
     [Display(Name = "Data urodzenia")] 
     public DateTime DateOfBirth { get; set; } 

     public virtual Client Client { get; set; } 

     public virtual Employee Employee { get; set; } 

     public string FullName 
     { 
      get 
      { 
       return FirstName + " " + LastName; 
      } 
     } 
    } 
} 

HomeController.cs

public class HomeController : Controller 
{ 
    private AquaparkContext db = new AquaparkContext(); 
    // GET: Home 
    public ActionResult Index() 
    { 
     IEnumerable<Opinion> opinions = (from o in db.Opinion 
             select new Opinion 
             { 
              Content = o.Content 
             }).AsEnumerable(); 
     //var randomOpinions = db.Opinion.Where(a => a.Date >= DateTime.Parse("2015-01-01")).OrderBy(g => Guid.NewGuid()).Take(6).ToList(); 
     IEnumerable<Person> authors = (from p in db.Person 
             join o in db.Opinion 
             on p.PersonId equals o.PersonId 
             select new Person 
             { 
              FullName = p.FirstName + p.LastName, 
             }).AsEnumerable(); 

     var vm = new OpinionViewModel() 
     { 
      Opinions = opinions, 
      Authors = authors, 
     }; 
     return View(vm); 
    } 

Opinion.cs

public class Opinion 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int OpinionId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int PersonId { get; set; } 
    [Required] 
    [StringLength(60, ErrorMessage = "Treść nie może zawierać więcej niż 40 znaków.")] 
    [Display(Name = "Treść")] 
    public string Content { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{dd/mm/yyyy}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Data wystawienia")] 
    public DateTime Date { get; set; } 
    public virtual Client Client { get; set; } 

} 

調用堆棧:

[NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.] ASP._Page_Views_Home_Opinia_cshtml.Execute() in c:\Users\Asus N551\OneDrive\Documents\Aquapark\Aquapark\Views\Home\Opinia.cshtml:10 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +198 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +105 System.Web.WebPages.StartPage.RunPage() +17 System.Web.WebPages.StartPage.ExecutePageHierarchy() +64 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +78 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +235 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107 Castle.Proxies.Invocations.IView_Render.InvokeMethodOnTarget() +118 Castle.DynamicProxy.AbstractInvocation.Proceed() +80 Glimpse.Core.Extensibility.CastleInvocationToAlternateMethodContextAdapter.Proceed() +11 Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +76 Glimpse.Core.Extensions.AlternateMethodContextExtensions.TryProceedWithTimer(IAlternateMethodContext context, TimerResult& timerResult) +135 Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +25 Glimpse.Core.Extensibility.AlternateTypeToCastleInterceptorAdapter.Intercept(IInvocation invocation) +84 Castle.DynamicProxy.AbstractInvocation.Proceed() +108 Castle.Proxies.IViewProxy.Render(ViewContext viewContext, TextWriter writer) +214 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291 Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionResult_callback(ControllerContext controllerContext, ActionResult actionResult) +13 Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionResult.InvokeMethodOnTarget() +113 Castle.DynamicProxy.AbstractInvocation.Proceed() +80 Glimpse.Core.Extensibility.CastleInvocationToAlternateMethodContextAdapter.Proceed() +11 Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +76 Glimpse.Core.Extensions.AlternateMethodContextExtensions.TryProceedWithTimer(IAlternateMethodContext context, TimerResult& timerResult) +135 Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +25 Glimpse.Core.Extensibility.AlternateTypeToCastleInterceptorAdapter.Intercept(IInvocation invocation) +84 Castle.DynamicProxy.AbstractInvocation.Proceed() +108 Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +202 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1 filters, ActionResult actionResult) +52 System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +173 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 System.Web.Mvc.Async.WrappedAsyncResult 1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End() +54 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39 System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End() +54 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651688 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

問題: 我想顯示一個意見的內容和作者(firstName和lastName),但它的錯誤:未設置爲一個對象的實例對象引用。我試過調試,我看到了2個系列:作者意見沒有任何價值。這個問題的原因是什麼,以及如何解決它以正確選擇數據。

+0

動作名稱索引,但視圖名爲Options.cshtml。這是一個錯字嗎? –

+1

嘗試用ToList()替換AsEnumerable() – Uriil

+3

看到這個錯誤:[什麼是NullReferenceException,我該如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a -nullreferenceexception-how-do-i-fix-it) – Grundy

回答

1

創建OpinionAuthor視圖模型,然後項目,這些類和使用ToList()

namespace Aquapark.ViewModels 
{  

    public class OpinionViewModel 
    { 
     public class OpinionDTO() 
     { 
     public string Content {get; set;} 
     public DateTime Date {get; set;} 
     public string PersonId {get; set;} 
     } 

     public class PersonDTO() 
     { 
     public int PersonId { get; set; }  
     public long Pesel { get; set; }  
     public string FirstName { get; set; }  
     public string LastName { get; set; }  
     public DateTime DateOfBirth { get; set; } 
     public string FullName 
      { 
      get 
      { 
       return FirstName + " " + LastName; 
      } 
      } 
     } 

     public IEnumerable<OpinionDTO> Opinions { get; set; } 
     public IEnumerable<PersonDTO> Authors { get; set; } 

    } 
} 

查詢:

IEnumerable<OpinionDTO> opinions = (from o in db.Opinion 
            select new OpinionDTO 
            { 
             Content = o.Content 
            }).ToList(); 
    //var randomOpinions = db.Opinion.Where(a => a.Date >= DateTime.Parse("2015-01-01")).OrderBy(g => Guid.NewGuid()).Take(6).ToList(); 
    IEnumerable<PersonDTO> authors = (from p in db.Person 
            join o in db.Opinion 
            on p.PersonId equals o.PersonId 
            select new PersonDTO 
            { 
             FullName = p.FirstName + p.LastName, 
            }).ToList(); 

參考文獻:

The entity cannot be constructed in a LINQ to Entities query

What is the effect of AsEnumerable() on a LINQ Entity?

+0

當我使用你的代碼時,我無法使用在IEnumberable集合中的ToList()。 –

+0

更新'IEnumerable '到'IEnumerable '。和'IEnumerable '到'IEnumerable ' – Hughnited

相關問題