Не один и тот же объект в двух действиях - PullRequest
0 голосов
/ 30 октября 2011

У меня есть представление Add, которое загружает файл, который является элементом Question class

@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 не имеет вопросов-наблюдений (является нулевым)

Почему этот объект сбрасывается?

У меня есть поле в контроллере:

 PasmISOContext db = new PasmISOContext();

Вот класс Question

публичный вопрос { [Key] public int Id {get; задавать; }

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

    }

1 Ответ

1 голос
/ 30 октября 2011

Причина, по которой QuestionRevisions не связывается должным образом, заключается в том, что соответствующее поле textarea не имеет правильного имени, чтобы связыватель модели по умолчанию мог его связать.Вы можете взглянуть на сообщение в блоге , объясняющее, каков правильный формат проводов для коллекций.

Поэтому, чтобы решить эту проблему, можно изменить тип в модели представления с *От 1005 * до IList<QuestionRevision>, чтобы у вас был доступ индексатора к элементам коллекции, а затем в представлении просто:

<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>

Обратите внимание, как имя текстовой области соответствует формату проводов, ожидаемому механизмом связывания модели по умолчанию для работы с коллекциями.Теперь, когда вы отправляете форму, список QuestionRevisions будет правильно привязан и будет содержать один элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...