【问题标题】:Not the same object in two actions两个动作中的对象不同
【发布时间】:2011-10-30 14:37:06
【问题描述】:

我有一个上传文件的添加视图,该文件是Question 类的元素

@model PasmISO.Domain.Question
@using (Html.BeginForm("Add", "Photo", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
   <div class="editor-field">
            @Html.TextAreaFor(model => model.QuestionRevisions.First().Content)
            @Html.ValidationMessageFor(model => model.QuestionRevisions.First().Content)
        </div>
    <input type="file" name="file" id="file" />
    <br/>
    <input type="submit" value="Ask" />
}

我的控制器中有 2 个动作

第一个动作是当用户点击添加按钮并获取表单上传照片时:

 public ActionResult Add()
        {
            db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") }, CreationDate = DateTime.Now, LastActivityDate = DateTime.Now, LastLoginDate = DateTime.Now });
            db.SaveChanges();
            db.Users.Local.First().Questions = new Collection<Question>() { new Question() };

            var question = new Question();
            question.QuestionRevisions = new Collection<QuestionRevision>();
            var questionRevision = new QuestionRevision();
            questionRevision.Tags = new Collection<Tag>();
            question.QuestionRevisions.Add(questionRevision);

            return View(question);
        }

当用户接受表单时触发的第二个动作:

    [HttpPost]
    public ActionResult Add(Question containers, HttpPostedFileBase file)
    {

问题是我看到 Question 没有 questionrevisions(为空)

为什么这个对象要重置?

我在 Controller 中有一个字段:

 PasmISOContext db = new PasmISOContext();

这是一个类Question

公开课问题 { [钥匙] 公共 int ID { 获取;放; }

    public virtual User Creator { get; set; }
    public int CreatorId { get; set; }
    public int PhotoId { get; set; }
    public virtual ICollection<QuestionRevision> QuestionRevisions { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<QuestionVote> Votes { get; set; }

    public virtual Photo Photo { get; set; }
}

这是我的上下文的定义:

public class PasmISOContext : DbContext
    {
        public DbSet<Avatar> Avatars { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<Question> Questions { get; set; }
        public DbSet<QuestionRevision> QuestionRevisions { get; set; }
        public DbSet<Photo> Photos { get; set; }
        public DbSet<Achievement> Achievements { get; set; }
        public DbSet<Comment> Comments { get; set; }
        public DbSet<Tag> Tags { get; set; }
        public DbSet<QuestionVote> QuestionVotes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }

    }

【问题讨论】:

    标签: asp.net-mvc-3 ef-code-first


    【解决方案1】:

    QuestionRevisions 未正确绑定的原因是因为相应的 textarea 字段没有正确的名称,因此默认模型绑定器可以绑定它。您可以查看following blog 帖子,其中解释了集合的正确电汇格式。

    因此,要解决此问题,一种可能是将视图模型中的类型从 ICollection&lt;QuestionRevision&gt; 更改为 IList&lt;QuestionRevision&gt;,以便索引器可以访问集合的元素,然后在视图中简单地访问:

    <div class="editor-field">
        @Html.TextAreaFor(x => x.QuestionRevisions[0].Content)
        @Html.ValidationMessageFor(x => x.QuestionRevisions[0].Content)
    </div>
    

    现在生成的 HTML 将如下所示:

    <div class="editor-field">    
        <textarea cols="20" name="QuestionRevisions[0].Content" id="QuestionRevisions_0__Content" rows="2">Some value</textarea>    
        <span class="field-validation-valid" data-valmsg-for="QuestionRevisions[0].Content" data-valmsg-replace="true"></span>
    </div>
    

    请注意 textarea 的名称如何尊重默认模型绑定器所期望的与集合一起使用的线格式。现在,当您提交表单时,QuestionRevisions 列表将被正确绑定,并且将包含单个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多