これが私がすることです:
これをプロジェクトに HtmlPrefixScopeExtensions.cs として保存します。
public static class HtmlPrefixScopeExtensions
{
public static IDisposable BeginPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}
internal class HtmlFieldPrefixScope : IDisposable
{
internal readonly TemplateInfo TemplateInfo;
internal readonly string PreviousHtmlFieldPrefix;
public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
{
TemplateInfo = templateInfo;
PreviousHtmlFieldPrefix = TemplateInfo.HtmlFieldPrefix;
TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix;
}
public void Dispose()
{
TemplateInfo.HtmlFieldPrefix = PreviousHtmlFieldPrefix;
}
}
}
次に、ビューを次のように変更します。
<div class="content">
<div>
@Html.EditorFor(model => model.Name)
</div>
<div>
@Html.EditorFor(model => model.Population)
</div>
</div>
に:
@using (Html.BeginPrefixScope("Country"))
{
<div class="content">
<div>
@Html.EditorFor(model => model.Name)
</div>
<div>
@Html.EditorFor(model => model.Population)
</div>
</div>
}
最後に、HtmlPrefixScopeExtensions.cs の場所に一致するビューに using ステートメントを含めることを忘れないでください。次に例を示します。
@using YourNamespace.Helpers
または正しい名前空間を Views/Web.config に追加します (これは断然お勧めのオプションです。一度だけ実行してください!):
<namespaces>
<add namespace="System.Web.Helpers" />
......
<add namespace="YourNamespace.Helpers" />
</namespaces>
現在: フィールドの名前は、たとえば「Country.Name」になります。
次に、投稿に一致する名前が必要です。
[HttpPost]
public ActionResult SaveCountry(Country country)
{
// save logic
return View();
}
クレジット: Steve Sanderson の素晴らしい BeginCollectionItem クラスを削除しました