MVC 3 set valoare implicită pe multe pentru mai multe relații (iCollection)

voturi
0

Învăț MVC 3 (primul cod) chiar acum, și am învățat foarte mult datorită unor tutoriale mari pe asp.net și câteva întrebări aici , pe StackOverflow, dar nu pot să dau ceva. Am încercat să setați o valoare implicită. Când cineva askes o întrebare, statutul de această întrebare trebuie să fie 3 (= fără răspuns) , în mod implicit. Am reușit să stabilească faptul că unul până datorită acest post: Valoarea implicită într - un model de asp.net vedere MVC , dar acum am încercat să fac același lucru pentru mai multe pe multe relații. (în QuestionModel publice ICollection Categorii virtuale)

Poate cineva să mă ajute pe asta.

Aceasta este QuestionModel mea (Question.cs)

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace MvcDatabase.Models
{
    public class Question
    {
        [Key]
        public int QuestionID { get; set; }

        [DisplayFormat(DataFormatString={0:d}, ApplyFormatInEditMode=true)]
        [Display(Name=Datum)]
        public DateTime Date { get; set; }

        [Required(ErrorMessage=Naam is een verplicht veld.)]
        [MaxLength(100, ErrorMessage=Naam kan maximum 100 karakters bevatten)]
        [Display(Name=Naam)]
        public string Author { get; set; }

        [Required(ErrorMessage=E-mail is een verplicht veld.)]
        [DataType(DataType.EmailAddress)]
        [Display(Name = Email)]
        public string MailAuthor { get; set; }

        [Required(ErrorMessage=Onderwerp is een verplicht veld.)]
        [MaxLength(100, ErrorMessage=Onderwerp kan maximum 100 karakters bevatten.)]
        [Display(Name=Onderwerp)]
        public string Title { get; set; }

        [Required(ErrorMessage=Bericht is een verplicht veld.)]
        [Display(Name=Bericht)]
        public string Message { get; set; }

        public virtual ICollection<Category> Categories { get; set; }
        public virtual ICollection<Reaction> Reactions { get; set; }

        [ForeignKey(Status)]
        public int StatusID { get; set; }
        public virtual Status Status { get; set; }

        public Question()
        {
            StatusID = 3;
        }
    }
}

Aceasta este CategoryModel (Category.cs)

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace MvcDatabase.Models
{
    public class Category
    {
        [Key]
        public int CategoryID { get; set; }

        [Required(ErrorMessage=Omschrijving is een verplicht veld.)]
        [MaxLength(100, ErrorMessage = Omschrijving kan maximum 100 karakters bevatten.)]
        [Display(Name=Categorie omschrijving)]
        public string Description { get; set; }

        public virtual ICollection<Question> Questions { get; set; }
    }
}

Și aceasta este DbContextModel (TestotheekDBContext.cs)

using System.Data.Entity;

namespace MvcDatabase.Models
{
    public class TestotheekDBContext: DbContext
    {
        public DbSet<Status> Statuses { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Question> Questions { get; set; }
        public DbSet<Employee> Employees { get; set; }
        public DbSet<Reaction> Reactions { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Question>()
                .HasMany(qc => qc.Categories)
                .WithMany(cq => cq.Questions)
                .Map(m => m.MapLeftKey(QuestionID)
                    .MapRightKey(CategoryID)
                    .ToTable(QuestionsWithCategory));
        }
    }
}

În cazul în care aveți nevoie de codul în controlerul

        public ActionResult Create()
        {
            return View(new Question());
        } 

        //
        // POST: /Default4/Create

        [HttpPost]
        public ActionResult Create(Question question)
        {
            var vraag = new Question();
            vraag.Date = DateTime.Now;
            vraag.Author = question.Author;
            vraag.MailAuthor = question.MailAuthor;
            vraag.Title = question.Title;
            vraag.Message = question.Message;

            if(ModelState.IsValid)
            {
                db.Questions.Add(vraag);
                db.SaveChanges();
                return RedirectToAction(Index,Home);
            }
            return View(question);
        }

(Nu am testat RedirectToAction retur)

EDITAȚI | ×

Acesta este rezultatul Sunt obtinerea prezent: introduceți După cum se poate vedea în ultima întrebare din prima secțiune (primul tabel) nu există nici o categorie (câmp este gol) acest lucru trebuie să fie la fel ca și toate celelalte întrebări din acest tabel nu categorie, deoarece administratorul trebuie să atribuie una (sau mai multe).

Întrebat 23/02/2013 la 09:18
de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Trebuie să atașați categoriile existente din contextul db la entitatea. Făcând acest lucru, în care operatorul nu este, în general, o idee bună (colector de gunoi, excepțiile privind entitățile non-existente). Mi-ar face asta în controlerul de acțiune a crea

 [HttpPost]
 public ActionResult Create(Question question)
 {
     var vraag = new Question();
     vraag.Date = DateTime.Now;
     vraag.Author = question.Author;
     vraag.MailAuthor = question.MailAuthor;
     vraag.Title = question.Title;
     vraag.Message = question.Message;

     // Add the default categories here!
     vraag.Categories = db.Categories.Where(c => c.SomeCriteria).ToList();

     if(ModelState.IsValid)
     {
         db.Questions.Add(vraag);
         db.SaveChanges();
         return RedirectToAction("Index","Home");
     }

     return  View(question);
 }
Publicat 23/02/2013 la 09:29
sursa de către utilizator

voturi
0

Deci, răspunsul nu este destul de ceea ce a spus Saintedlame, dar el a sigur mi-a indicat în mod corect. În primul rând, după depanare am văzut că linia var vraag = întrebare nouă () a fost inutil, deoarece aproape totul excisted în cauză. Am avut pentru a adăuga data și o categorie la acesta. Din nou, vă mulțumesc Saintedlame!

Aceasta este real ActionResult:

        [HttpPost]
        public ActionResult Create(Question question)
        {
            question.Date = DateTime.Now;
            if (question.Categories == null) 
            {
                var category = db.Categories
                    .Include(q => q.Questions)
                    .Where(q => q.CategoryID == 1)
                    .ToList();
                question.Categories = category;
            }

            if(ModelState.IsValid)
            {
                db.Questions.Add(question);
                db.SaveChanges();
                return RedirectToAction("Index","Home");
            }
            return View(question);
        }

Iată rezultatul:

introduceți descrierea imaginii aici

Publicat 23/02/2013 la 10:27
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more