2011-10-30 11 views
0

我有上傳文件添加視圖,其是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) 
    { 

的問題是THA我看到Question還沒有questionrevisions(爲null)

爲什麼這個對象進行復位?

我有一個領域控制器:

PasmISOContext db = new PasmISOContext(); 

這是一類Question

公共類問題 { [關鍵] 公衆詮釋標識{獲得;組; }

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

的QuestionRevisions沒有得到正確綁定的原因是因爲相應的textarea的領域沒有一個正確的名稱,以便默認模型綁定器可以綁定它。你可以看看following blog的帖子,解釋什麼是收集的正確線路格式。

因此,要解決這個問題的一種可能性是在您的視圖模型更改類型從ICollection<QuestionRevision>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> 

通知textarea的名字如何尊重由默認的模型綁定有望與收藏工作的有線格式。現在,當您提交表單時,QuestionRevisions列表將被正確綁定,並且它將包含單個元素。