Софтуерно Инженерство
Loading...
+ Нов въпрос
Konstantin_Kosev avatar Konstantin_Kosev 11 Точки

DropDownListFor from ASP.NET MVC Projects

Здравейте,

При създаване на категории браузъра ми отпечатва грешка в DropDownListFor във файла Create .

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 
 


Line 21:                 @Html.LabelFor(m => m.Content, new { @class = "control-label col-sm-4" })
Line 22:                 <div class="dropdown col-sm-4">
Line 23:                     @Html.DropDownListFor(m => m.CategoryId,
Line 24:                        new SelectList(Model.Categories, "Id", "Name"))
Line 25:                 </div>

Все още не съм написал нищо в Article.cs в папката с моделите защото при изписване на properties всичко се чупи.

Тагове:
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

А какво подаваш като модел на View-то? Има ли шанс нещо да не е инициализирано. Примерно списъка categories?

0
Konstantin_Kosev avatar Konstantin_Kosev 11 Точки

@model Blog.Models.ArticleViewModel
@{
    ViewBag.Title = "Create";
}

<div class="container">
    <div class="well">
        <h2>Create Article</h2>
        @using (Html.BeginForm("Create", "Article", FormMethod.Post, new { @class = "form-horizontal" }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary("", new { @class = "text-danger" })

            <div class="form-group">
                @Html.LabelFor(m => m.Title, new { @class = "control-label col-sm-4" })
                <div class="col-sm-4">
                    @Html.TextBoxFor(m => m.Title, new { @class = "form-control" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(m => m.Content, new { @class = "control-label col-sm-4" })
                <div class="dropdown col-sm-4">
                    @Html.DropDownListFor(m => m.CategoryId,
                       new SelectList(Model.Categories, "Id", "Name"))
                </div>

            </div>

            <div class="form-group">
                @Html.LabelFor(m => m.CategoryId, new { @class = "control-label col-sm-4" })
                <div class="col-sm-4">
                    @Html.TextAreaFor(m => m.Categories, new { @class = "form-control", @rows = "7" })
                </div>
            </div>


            <div class="form-group">
                <div class="col-sm-4 col-sm-offset-4">
                    @Html.ActionLink("Cancel", "Index", "Article", null, new { @class = "btn btn-default" })
                    <input type="submit" value="Create" class="btn btn-success" />
                </div>
            </div>
        }
    </div>
</div>

 

Това е Create от папка View/ Article .Иначе в View/Categories да не е инициализирано Details.

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Дай кода от контролера.

0
Konstantin_Kosev avatar Konstantin_Kosev 11 Точки

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Blog.Models;

namespace Blog.Controllers.Admin
{
    public class CategoriesController : Controller
    {
        private BlogDbContext db = new BlogDbContext();

        // GET: Categories
        public ActionResult Index()
        {
            return View(db.Categories.ToList());
        }

        // GET: Categories/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Category category = db.Categories.Find(id);
            if (category == null)
            {
                return HttpNotFound();
            }
            return View(category);
        }

        // GET: Categories/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: Categories/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Name")] Category category)
        {
            if (ModelState.IsValid)
            {
                db.Categories.Add(category);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(category);
        }

        // GET: Categories/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Category category = db.Categories.Find(id);
            if (category == null)
            {
                return HttpNotFound();
            }
            return View(category);
        }

        // POST: Categories/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Name")] Category category)
        {
            if (ModelState.IsValid)
            {
                db.Entry(category).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(category);
        }

        // GET: Categories/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Category category = db.Categories.Find(id);
            if (category == null)
            {
                return HttpNotFound();
            }
            return View(category);
        }

        // POST: Categories/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Category category = db.Categories.Find(id);
            db.Categories.Remove(category);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
 

0
ZornitsaSerbezova avatar ZornitsaSerbezova 454 Точки

"Все още не съм написал нищо в Article.cs"

А дали не е това проблема? Странно е да имаш ArticleViewModel, а да нямаш Article модел.

Все още не съм се замисляла точно как работят вю моделите.

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Ами те просто държат данни за вю-то.

0
ZornitsaSerbezova avatar ZornitsaSerbezova 454 Точки

Да, но кави данни подава на вю-то, като няма модел? ArticleViewModel не сам по себе си създава ли модел в базата.

Дори не знам как да си задам въпросът.

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Данните, които отиват във View-то не е нужно да идват от база данни.

Ако да речем имаш ViewModel-а ArticleViewModel със следните характеристики:

class ArticleViewModel
{
    public string Title { get; set; }
    public string Boy { get; set; }
}

Имаш хиляди начини да го попълниш, за да го пратиш на View-то. Можеш да изтеглиш реална статия от базата данни и да я превърнеш във ArticleViewModel. Можеш да си измислиш данни и да ги сложиш там. Може да прочетеш File и данните от него да сложиш в този ViewModel. Може от потребителския вход да обработиш данните и да ги превърнеш във ViewModel. Разбира се, най-често се случва да извадиш нещо от база данни и да го подадеш на изгледа:

public ActionResult Details(int id)
{
    Article article = this.Data.Articles.Find(id);
    ArticleViewModel viewModel = new ArticleViewModel()
           {
               Title = article.Title,
               Body = article.Body
           };

    return View(viewModel);
}

Но нищо не пречи да изглежда и така:

public ActionResult Details(int id)
{
    ArticleViewModel viewModel = new ArticleViewModel()
           {
               Title = "Some fake title, just to test the view",
               Body = "Some fake body for the same purpose {lorem ipsum}"
           };

    return View(viewModel);
}

 

2