c# - MVC3を使用して文字列のコレクションを作成および編集する

原文 c# asp.net-mvc asp.net-mvc-3 icollection

フォームを使用して文字列のコレクションを作成および編集する方法を理解するのに問題があります。 EditorForを使用してみましたが、運が悪いようで、代わりに次のテキストをフォームに入力します。コレクション「キーワード」を編集しようとしています。

System.Collections.Generic.HashSet`1[MVCModuleStarter.Models.Module]System.Collections.Generic.HashSet`1[MVCModuleStarter.Models.Module]


これは、私がEditorForを使用しているHTMLであり、文字列に対して参照用に使用されているEditorForを使用しています。

<div class="form-group">
            @Html.LabelFor(model => model.Category, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Category, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Category, "", new { @class = "text-danger" })
            </div>
        </div>


        <div class="form-group">
        @Html.LabelFor(model => model.Keywords, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Keywords, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Keywords, "", new { @class = "text-danger" })
        </div>
    </div>


これは私のコントローラー内のEditメソッドです。

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "ModuleId,ModuleTitle,ModuleLeader,ModuleDescription,ImageURL,Category,Keywords")] Module module)
        {
            if (ModelState.IsValid)
            {
                int moduleId = module.ModuleId;
                repository.UpdateModule(module);
                repository.Save();
                return RedirectToAction("Details", new { Id = moduleId });
            }
            return View(module);
        }


これは参照用のモデルです。

[Required, StringLength(20), Display(Name = "Category")]
        public string Category { get; set; }

        public virtual ICollection<Keyword> Keywords { get; set; }


キーワードのモデル

    public class Keyword
    {
        [Key, Display(Name = "ID")]
        public int KeywordId { get; set; }

        [Required, StringLength(100), Display(Name = "Keyword")]
        public string KeywordTerm { get; set; }

        public virtual ICollection<Module> Modules { get; set; }
    }
}


どんな助けも素晴らしいですが、これはまだ新しいです!ありがとう!
答え
たとえば、EditorTemplateKeywordを作成する必要があります。

/Views/Shared/EditorTemplates/Keyword.cshtml内(必要に応じてdiv、クラス名などを追加)

@model Keyword
@Html.HiddenFor(m => m.KeywordId)
@Html.LabelFor(m => m.KeywordTerm)
@Html.TextBoxFor(m => m.KeywordTerm)
@Html.ValidationMessageFor(m => m.KeywordTerm)


次にメインビューで

Html.EditorFor(m=> m.Keywords)


注私はコレクションプロパティModulesを省略していますが、それらも編集したい場合は、EditorTemplateに別のModulesを追加します。

または、メインビューでforループを使用することもできます。これは、コレクションがIList<T>である必要があることを意味します

for(int i = 0; i < Model.Keywords.Count, i++)
{
  @Html.HiddenFor(m => m.Keywords[i].KeywordId)
  // other properties of Keyword
  for (int j = 0; j < Model.Keywords[i].Modules.Count; j++)
  {
    @Html.TextBoxFor(m => m.Keywords[i].Modules[j].SomeProperty)
    // other properties of Module
  }
}
関連記事

c# - nil xml要素に属性を指定する

c# - カスタムデータモデルセッター

c# - 複数のテーブルを検索しながら単一の入力を使用して検索

c# - Wordへのエクスポートはローカルで機能しますが、IIS6では機能しません

c# - Tを列挙型に制限するジェネリックメソッドを作成する

c# - FileSystemWatcherイベントのあるWindowsサービスがトリガーされない

c# - カスケードドロップダウンリストがJqueryで機能しない

c# - System.AccessViolationException 'がAzureのSystem.Net.Http.Formatting.dllで発生しました

c# - wpf mvvmのdatagridに新しく追加された行にスクロールする方法

c# - ルートのSignalRエンドポイントに表示されるHTMLを設定する