MVC3 HTML 名の衝突
MVC3 では機能しない切り取りと貼り付け。拡張機能を機能させるには、クラス ファイルを作成する必要がありました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace incMvcSite.Classes {
public static class HtmlPrefixScopeExtensions {
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix) {
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}
private class HtmlFieldPrefixScope : IDisposable {
private readonly TemplateInfo templateInfo;
private readonly string previousHtmlFieldPrefix;
public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix) {
this.templateInfo = templateInfo;
previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
}
public void Dispose() {
templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
}
}
}
}
Razor (.cshtml) ファイルに、次を追加しました。
@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
<fieldset>
<legend>Permission</legend>
// The Html.EditorFor's would go here...
</fieldset>
}
拡張クラスをスコープに入れるために使用していることに注意してください。これにより、2 番目の using 行が機能します。
問題は、ポストバック時にオブジェクトが更新されないことです。私のコントローラーでは、2 番目のパラメーターを使用してプレフィックスを指定しました。
TryUpdateModel(modelUser.Permission, "Permission");
これにより、HTML のすべてのフィールドにプレフィックスが追加され、TryUpdateModel はプレフィックス付きのコントロール名でオブジェクトをロードしました。埋め込まれた編集リスト、および同じプロパティ名を持つモデルの部分ビューのコントロールに適切に名前を付けることができるようになりました。