簡體   English   中英

ASP.NET MVC DropDownList NullReferenceException

[英]ASP.NET MVC DropDownList NullReferenceException

我有一個問題,我的dropDownList給我一個NullReferenceException,我不知道為什么。

我想發布一個帖子,您可以使用DropDownList選擇它所屬的類別。

這是我的一些代碼:

PostModel

public class Post
    {
        [Key]
        public int PostID { get; set; }

        [Display(Name = "Idea Title")]
        public String Title { get; set; }

        [Display(Name = "Description")]
        public String DescText { get; set; }

        [Display(Name = "Votes")]
        public int Votes { get; set; }

        [Display(Name = "Comments")]
        public int CommentCount { get; set; }

        [Display(Name = "Posted:")]
        [DataType(DataType.DateTime)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
        public DateTime CreatedDate { get; set; }

        [Display(Name = "Last Edited:")]
        [DataType(DataType.DateTime)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
        public DateTime? EditedDate { get; set; }

        public String UserName { get; set; }

        public virtual Status Status { get; set; }
        public virtual Category Category { get; set; }
        public virtual Department Department { get; set; }
        public virtual ICollection<Comment> Comments { get; set; }
    }

PostViewModel

public class PostCreateViewModel
    {
        [Required]
        [Display(Name = "Title")]
        [MinLength(10, ErrorMessage = "The title must be at least 10 characters long.")]
        [StringLength(100, ErrorMessage = "The title cannot be longer than 100 characters.")]
        public String Title { get; set; }

        [Required]
        [DataType(DataType.MultilineText)]
        [MinLength(50, ErrorMessage = "The description of your idea should be at least 50 characters long.")]
        public String DescText { get; set; }

        [Required]
        [Display(Name = "Category")]
        public int SelectedCategoryId { get; set; }
        public IEnumerable<SelectListItem> Categories { get; set; }
    }

CategoryModel

    public class Category
    {
        [Key]
        public int CategoryID { get; set; }

        [Display(Name = "Category Name")]
        public String CategoryName { get; set; }
    }

    public class DbCategories
    {
        private IdeaContext context = new IdeaContext();

        public List<Category> GetCategories()
        {
            return context.Categories.ToList();
        }
    }

PostController UPDATED

        private IEnumerable<SelectListItem> GetCategories()
        {
            var dbCategories = new DbCategories();
            var categories = dbCategories
                             .GetCategories()
                             .Select(x =>
                                     new SelectListItem
                                     {
                                         Value = x.CategoryID.ToString(),
                                         Text = x.CategoryName
                                     });
            return new SelectList(categories, "Value", "Text");
        }

        [HttpGet]
        public ActionResult Create()
        {
            var model = new PostCreateViewModel { Categories = GetCategories() };
            return View(model);
        }

        [HttpPost]
        public ActionResult Create(PostCreateViewModel model)
        {
            model.Categories = GetCategories();
            if (ModelState.IsValid)
            {
                var post = new Post();

                // From ViewModel
                post.Title = model.Title;
                post.DescText = model.DescText;

                var dbCategories = new DbCategories();
                var categories = dbCategories.GetCategories();

                post.Category = categories.FirstOrDefault(x => x.CategoryID == model.SelectedCategoryId);

                // Controller created
                post.CreatedDate = DateTime.Now;
                post.Votes = 0;
                post.CommentCount = 0;
                post.Status.StatusName = "Active";
                post.Department = null;
                post.UserName = User.Identity.Name;

                context.Posts.Add(post);
                context.SaveChanges();

                return RedirectToAction("Index");
            }
            else
            {
                return View();
            }
        }

而我的觀點

@model WebApplication3.Models.ViewModels.PostCreateViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-group top-space-large">
        @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.SelectedCategoryId, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.SelectedCategoryId, Model.Categories, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.SelectedCategoryId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group top-space-large">
        @Html.LabelFor(model => model.DescText, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.DescText, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.DescText, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group top-space-large">
        <button type="submit" class="btn btn-default">Submit</button>
    </div>
}

堆棧異常

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=App_Web_jqgoppva
  StackTrace:
       at ASP._Page_Views_Post_Create_cshtml.Execute() in \\etj\My Documents\Visual Studio 2013\Projects\WebApplication3\WebApplication3\Views\Post\Create.cshtml:line 24
       at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
       at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
       at System.Web.WebPages.StartPage.RunPage()
       at System.Web.WebPages.StartPage.ExecutePageHierarchy()
       at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
       at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
       at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
       at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
  InnerException: 

為什么會這樣? 當我嘗試發布表單時,我在DropDownList行的視圖中得到“對象引用未設置為對象的實例”。 context.Categories不為空。 它包含ID為28的“Web”和ID為31的“Environment”。

我發現這種情況的唯一原因是因為在POST操作中你想使用不持久的Model.Categories 您必須在操作Create再次調用GetCatgories()方法。

你得到NullReference異常因為post.Categorynull而你無法訪問null對象的屬性, post.Category.CategoryID = model.SelectedCategoryId; 您必須根據SelectedCategoryId從數據庫中查詢Category

[HttpPost]
public ActionResult Create(PostCreateViewModel model)
{
    model.Categories = GetCategories(); // call again, Categories don't persist in a POST.
    if (ModelState.IsValid)
    {
        var post = new Post();

        // ...
        post.Category = context.Categories.FirstOrDefault(x => x.CategoryId == model.SelectedCategoryId);
        // ...

        return RedirectToAction("Index");
    }

    return View(model);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM