Jak zrobić złożone modele, i pobrać dane po ID.

0

Witam.

https://bitbucket.org/Draqun/aspforum/src - kod aplikacji

Jestem świeżakiem w ASP.NET. Mianowicie muszę napisać forum i nie bardzo idzie mi komunikacja z bazą danych. Mianowicie stworzyłem projekt w MVC5. Wraz z projektem dostarczony został system użytkowników, który mi odpowiada. Następnie stworzyłem sobie bazę i tabele mi odpowiadające i wygenerowałem model EntityFramework a na podstawie modelu całe klasy CRUD'a. Wszystko byłoby super, gdyby nie to, że nie wszystko da się zrobić tutaj tak prosto jak w RoR czy w Django :) Mianowicie w kontrolerze tematów chcę podać przy dodawaniu ID użytkownika, który to tworzy i klucz obcy do kategorii forum (działu, ale zwał jak zwał). No i tutaj napotkałem następujące problemy.

  1. W metodzie Index jak chce wrzucić do widoku nazwę kategorii otrzymuję wyjątek, a robię to za pomocą nastepującego kodu
  ViewBag.CategoryName = db.Categories.Find(CategoryId).Name;

Niestety metoda Find niczego nie znajduję.

  1. Przy tworzeniu chcę dodać do tematu Id kategorii i Id usera. Nie jestem pewien co robię źle, ale również i tu rzuca mi wyjątkiem (metoda Create w w TopicsController). Swoją drogą nie mam bladego pojęcia jak pobrać id usera. User.Identity nie zwraca zawartości pola Id, no i podobny problem co z metodą Index i dostępem do Category.

  2. Jest jakaś fajna możliwość w jednym widoku wyświetlenia dwóch formularzy? Chciałbym przy tworzeniu tematu automatycznie utworzyć pierwszy post.

Aby temat był kompletny dodaję fragment omawianego kontrolera.

namespace Forum.Controllers
{
    public class TopicsController : Controller
    {
        private TopicsContext db = new TopicsContext();

        //
        // GET: /Topics/

        public ActionResult Index(int CategoryId)
        {
            var topics = db.Topics.Include(t => t.Category);
            ViewBag.CategoryId = CategoryId;
            return View(topics.ToList());
        }

        //
        // GET: /Topics/Create

        public ActionResult Create(int CategoryId)
        {
            ViewBag.CategoryId = new SelectList(db.Categories, "Id", "Name");
            ViewBag.CategoryIds = CategoryId;
            return View();
        }

        //
        // POST: /Topics/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Topic topic, int CategoryId)
        {
            if (ModelState.IsValid)
            {
                topic.Author = 1;
                topic.CategoryId = CategoryId;
                db.Topics.Add(topic);
                db.SaveChanges();
                return RedirectToAction("Index", "Topics", new { CategoryId = CategoryId });
            }

            ViewBag.CategoryId = new SelectList(db.Categories, "Id", "Name", topic.CategoryId);
            ViewBag.CategoryIds = CategoryId;
            ViewBag.CategoryName = db.Categories.Find(CategoryId).Name;
            return View(topic);
        }
...
}
1

Generalnie jak mowisz o wyjatku, warto by bylo napisac jaki wyjątek jest rzucany. I w koncu czy rzuca wyjatek czy nic nie znajduje?

Wyjatek w widoku, czy kontrolerze? Czy wyjatek dlatego ze nie znalazl niczego i probujesz to wyswietlic?

Sprawdziles czy w dobrej bazie danych zapisujesz kategorie:)? Bo widze ze masz ich kilka.

https://msdn.microsoft.com/en-us/data/jj592674.aspx

0

Przede wszystkim nie używaj ViewBag, to znacznie ułatwi zadanie.

0

@Świetny kot: Dobry link. Nie wiedziałem, że podczas tworzenia contextów zostały stworzone kolejne bazy danych. Szczerze nie spodziewałem się takiego czegoś. To rozwiązało problem z dostępem.

@somekind: A co proponujesz w zamian? Kiedyś jak pisałem pierwszy raz korzystałem z obiektu ViewData.

Z drugiej strony jak dostać się do ID użytkownika aktualnie zalogowanego? Ew. Jak zmienić definicję tabeli bezboleśnie aby zamiast inta (który jest id'kiem usera w innej bazie) wstawiać po prostu jego nazwę (zdaje sobie sprawę, że to wyjście jest chyba najgorszym z możliwych, ale do nazwy użytkownika mam dostęp).

0
Draqun napisał(a):

@somekind: A co proponujesz w zamian? Kiedyś jak pisałem pierwszy raz korzystałem z obiektu ViewData.

Zdefiniować ViewModele i używać ich w widokach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1