2016-03-30 28 views
0

私のビューからコントローラ(アクション)への "ファイル"のリストを含むviewmodelを渡す際に問題が発生しました。 viewmodelは、リスト(リストファイル)を除くすべてのpropetriesでactionresultに渡されているようです。フォームを送信するときにモデルにファイルが含まれていても、リストはnullのままです。リストを含むviewmodelをコントローラアクション(MVC 5)に渡すことができません

どうすればいいですか?コントローラ、モデル、ビューモデル、私のRazorHTMLから私のC#コードを貼り付けます。

ファイルモデル:

public class File 
{ 
    [Key] 
    public int ID { get; set; } 
    [Display(Name = "Filnamn")] 
    public string Filename { get; set; } 
    //[Display(Name = "Beskrivning")] 
    //public string Description { get; set; } 
    [Display(Name = "Filtyp")] 
    public string ContentType { get; set; } 
    public byte[] Data { get; set; } 
    public int Size { get; set; } 

    //public string CreatorId { get; set; } 

    public string CreatorID { get; set; } 
    [Required] 
    [Display(Name = "Skapare")] 
    [ForeignKey("CreatorID")] 
    public virtual ApplicationUser Creator { get; set; } 

    //public int DocumentId { get; set; } 

    public int DocumentID { get; set; } 
    [Required] 
    [Display(Name = "Dokument")] 
    [ForeignKey("DocumentID")] 
    public virtual Document Document { get; set; } 
} 

のViewModel:

public class CreateDocumentViewModel 
{ 
    public CreateDocumentViewModel() 
    { 
     CheckboxUsers = new List<CheckBoxListUser>(); 
     CheckboxGroups = new List<CheckBoxListGroup>(); 
     CheckboxTags = new List<CheckBoxListTags>(); 
     Files = new List<File>(); 
    } 

    [Display(Name = "Beskrivning")] 
    public string Description { get; set; } 
    [Display(Name = "Titel")] 
    public string Name { get; set; } 
    [DataType(DataType.MultilineText)] 
    [Display(Name = "Markdown")] 
    public string Markdown { get; set; } 
    HttpPostedFileBase FileToAdd { get; set; } 

    [Display(Name="Användare")] 
    public List<CheckBoxListUser> CheckboxUsers { get; set; } 
    [Display(Name = "Grupper")] 
    public List<CheckBoxListGroup> CheckboxGroups { get; set; } 
    [Display(Name = "Taggar")] 
    public List<CheckBoxListTags> CheckboxTags { get; set; } 
    [Display(Name = "Filer")] 
    public ICollection<File> Files { get; set; } 
    public string FilesJson { get; set; } 
} 

ビュー:

@model MarkdownManagerNew.Viewmodels.CreateDocumentViewModel 

@{ 
    ViewBag.Title = "CreateDocument"; 
} 

<h2>Nytt dokument</h2> 


@Html.BeginForm("CreateFile", "User", new { model = Model, test = Model.Name, files = Model.Files }, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

    <div class="form-group"> 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control", placeholder = "Titel" } }) 
      @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control", placeholder = "Beskrivning" } }) 
      @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="row"> 
     <div class="col-sm-12"> 
      <div class="form-group col-md-6 markdownEditorForm"> 
       <div class="col-md-12"> 
        @Html.EditorFor(model => model.Markdown, new { htmlAttributes = new { @class = "form-control markdownEditor" } }) 
        @Html.ValidationMessageFor(model => model.Markdown, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
      <div class="col-sm-6 markdownResult"></div> 
     </div> 
    </div> 

    <div class="row"> 
     <dl class="dl-horizontal"> 
      <dt> 
       @Html.DisplayNameFor(model => model.CheckboxGroups) 
      </dt> 

      @for (int i = 0; i < Model.CheckboxGroups.Count; i++) 
      { 
       <dd> 
        @Html.CheckBoxFor(x => x.CheckboxGroups[i].IsChecked) 
        @Html.HiddenFor(x => x.CheckboxGroups[i].ID) 
        @Html.HiddenFor(x => x.CheckboxGroups[i].Display) 

        @Html.DisplayFor(x => x.CheckboxGroups[i].Display) 
       </dd> 
      } 


      <dt> 
       @Html.DisplayNameFor(model => model.CheckboxUsers) 
      </dt> 

      @for (int i = 0; i < Model.CheckboxUsers.Count; i++) 
      { 
       <dd> 
        @Html.CheckBoxFor(x => x.CheckboxUsers[i].IsChecked) 
        @Html.HiddenFor(x => x.CheckboxUsers[i].ID) 
        @Html.HiddenFor(x => x.CheckboxUsers[i].Display) 

        @Html.DisplayFor(x => x.CheckboxUsers[i].Display) 
       </dd> 
      } 

      <dt> 
       @Html.DisplayNameFor(model => model.CheckboxTags) 
      </dt> 

      @for (int i = 0; i < Model.CheckboxTags.Count; i++) 
      { 
       <dd> 
        @Html.CheckBoxFor(x => x.CheckboxTags[i].IsChecked) 
        @Html.HiddenFor(x => x.CheckboxTags[i].ID) 
        @Html.HiddenFor(x => x.CheckboxTags[i].Display) 

        @Html.DisplayFor(x => x.CheckboxTags[i].Display) 
       </dd> 
      } 

     </dl> 
    </div> 

    <div class="form-group"> 
     @Html.Label("File", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <input type="file" id="File" name="upload" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Ladda upp fil" class="btn btn-default" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-10"> 
      @if (Model.Files.Count > 0) 
      { 
       <h3>@Html.DisplayNameFor(model => model.Files)</h3> 
       <table class="table table-striped table-bordered"> 
        <tr> 
         <th>Filename</th> 
         <th>Filetype</th> 
         <th>Size(bytes)</th> 
        </tr> 

        @foreach (var file in Model.Files) 
        { 
         <tr> 
          <td>@file.Filename</td> 
          <td>@file.ContentType</td> 
          <td>@file.Size</td> 
         </tr> 
        } 

       </table> 
      } 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-1 col-md-10"> 
      <input type="submit" value="Skapa" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 


<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

コントローラ

[HttpPost] 
    public ActionResult CreateFile(CreateDocumentViewModel viewModel) 
    { 
     var file = repo.CreateFile(upload, GetCurrentUser()); 
     viewModel.Files.Add(file); 
     TempData["viewModel"] = viewModel; 

     //return RedirectToAction("CreateDocument", file); 
     return RedirectToAction("CreateDocument", new { files = viewModel.Files }); 

    } 

-EDIT-

私もこのようなすべてのファイル内のすべてのプロパティのeditorfieldsを追加しようとしている:

@for (int i = 0; i < Model.Files.Count; i++) 
{ 
    <div> 

     @Html.LabelFor(x => x.Files[i].DocumentID) 
     @Html.EditorFor(x => x.Files[i].DocumentID) 
     @Html.ValidationMessageFor(x => x.Files[i].DocumentID) 
     @Html.LabelFor(x => x.Files[i].CreatorID) 
     @Html.EditorFor(x => x.Files[i].CreatorID) 
     @Html.ValidationMessageFor(x => x.Files[i].CreatorID) 
     @Html.LabelFor(x => x.Files[i].ID) 
     @Html.EditorFor(x => x.Files[i].ID) 
     @Html.ValidationMessageFor(x => x.Files[i].ID) 
     @Html.LabelFor(x => x.Files[i].ContentType) 
     @Html.EditorFor(x => x.Files[i].ContentType) 
     @Html.ValidationMessageFor(x => x.Files[i].ContentType) 
     @Html.LabelFor(x => x.Files[i].CreatorID) 
     @Html.EditorFor(x => x.Files[i].CreatorID) 
     @Html.ValidationMessageFor(x => x.Files[i].CreatorID) 
     @Html.LabelFor(x => x.Files[i].Data) 
     @Html.EditorFor(x => x.Files[i].Data) 
     @Html.ValidationMessageFor(x => x.Files[i].Data) 
     @Html.LabelFor(x => x.Files[i].Filename) 
     @Html.EditorFor(x => x.Files[i].Filename) 
     @Html.ValidationMessageFor(x => x.Files[i].Filename) 
     @Html.LabelFor(x => x.Files[i].Size) 
     @Html.EditorFor(x => x.Files[i].Size) 
     @Html.ValidationMessageFor(x => x.Files[i].Size) 
    </div> 
} 

答えて

0

あなたのファイルの種類がいるICollectionであるので、各ファイルの情報をできるようにするには、フォーム内に存在することが必要ですポピュレートされたビューモデルのコントローラに送信されます。現在、このコレクションのフィールドはありません。そのようなICollectionは、コントローラにポストされると空になります。カスタムEditorForを作成してファイルデータを表示し、このデータをコントローラに送信することができます。

これを行う方法で、このチュートリアルを参照してください:あなたは、チェックボックスのために似たようなやっているあなたのコードで

http://blog.learningtree.com/en/editing-collections-in-asp-net-mvc/

@for (int i = 0; i < Model.CheckboxUsers.Count; i++) 
{ 
    <dd> 
     @Html.CheckBoxFor(x => x.CheckboxUsers[i].IsChecked) 
     @Html.HiddenFor(x => x.CheckboxUsers[i].ID) 
     @Html.HiddenFor(x => x.CheckboxUsers[i].Display) 

     @Html.DisplayFor(x => x.CheckboxUsers[i].Display) 
    </dd> 
} 

注隠しフィールドを、これはさチェックボックスのリストのためにコントローラにデータを渡すもの。私はファイルのためのカスタムEditorForを作成することをお勧めします。または、コントローラからファイルのコレクションをモデルから再度読み込むだけです。

+0

私はすべてのファイルのすべてのプロパティの編集フィールドを追加しようとしました。しかし、それはまだファイルがコントローラに通過しているように見えません。 – filemilk

+0

ああ、私は今働いているようだ!本当にありがとう! – filemilk

0

しかし、Filesコレクションはどの入力にもありません。彼らは基本的に単なるラベルなので、サーバーには投稿しません。ユーザーによって変更されることはないため、DBからファイルをロードするだけで作業を再開できます。

+0

ああ、そうです。しかし、ファイルはまだDBに存在しません。一時的な文書にファイルをアップロードするオプションがあります。次に、ファイルを含む文書を作成します。その後、ファイルはデータベースに存在します。 ファイルを入力の一部にしてモデルに渡すにはどうすればよいですか? Iveはどんな成功でも隠された入力をしようとしました。多分私はそれを間違っている? – filemilk

+0

あなたが求めている別の質問のように見えますが、私はそれが何であるか分かりません。 –

関連する問題