【问题标题】:MVC 3 set default value on many to many relationship (iCollection)MVC 3 在多对多关系(iCollection)上设置默认值
【发布时间】:2013-02-23 11:18:06
【问题描述】:

我现在正在学习 MVC 3(代码优先),我学到了很多东西,这要归功于 asp.net 上的一些很棒的教程和 stackoverflow 上的一些问题,但我想不通。我正在尝试设置默认值。当有人提出问题时,默认情况下该问题的状态必须为 3(= 未回答)。多亏了这篇文章,我已经设法设置好了:Default value in an asp.net mvc view model 但现在我正试图为多对多的关系做同样的事情。 (在 QuestionModel 公共虚拟 ICollection 类别中)

谁能帮我解决这个问题。

这是我的 QuestionModel (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;
        }
    }
}

这是 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; }
    }
}

这是 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"));
        }
    }
}

如果您需要控制器中的代码

        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);
        }

(没有测试return RedirectToAction)

编辑

这是我目前得到的结果: 正如您在第一部分(第一个表)的最后一个问题中看到的那样,没有类别(字段为空),这必须与该表中的所有其他问题相同,没有类别,因为管理员必须分配一个(或更多)。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    您需要将数据库上下文中的现有类别附加到您的实体。在控制器中执行此操作通常不是一个好主意(垃圾收集器,不存在实体的异常)。我会在你的控制器创建动作中这样做

     [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);
     }
    

    【讨论】:

    • 提交问题的人不能选择类别。 (这不是通过附加现有类别而变成的吗?)稍后由其他人(管理员)分配一个类别。这就是为什么我需要一个默认值 1 (CategoryID = 1)。
    【解决方案2】:

    所以答案并不完全是 Saintedlame 所说的,但他确实以正确的方式指出了我。首先,在调试之后,我看到 var vraag = new Question() 行没有用,因为几乎所有问题都被排除了。我只需要添加日期和类别即可。再次感谢圣德拉姆!

    这是实际的 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);
            }
    

    结果如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2014-08-02
      • 2019-06-21
      • 1970-01-01
      • 2021-06-07
      • 2015-12-20
      • 2013-05-13
      相关资源
      最近更新 更多