これは主観的であり、異なる意見になるでしょう。
これは私が編集と各モデルを見るための別個のビューを望んでいなかったのと同じ問題に直面していました。だから私はそれの内部に2つのコンポーネントで外側divが作成されたMVCヘルパーを作成しました。 1つは閲覧用、もう1つは編集用です。編集と表示の切り替えに共通の角度変数がありました。効果は、HTMLが大きいですが、cshtmlはまだ小さく、読みやすいです。
Bobのコメントでは、悪意のあるユーザーが編集可能なビューに手動で切り替えることは可能ですが、そのユーザーがアクセス権を持っていなければ変更を保存することはできません。更新/ポストを作成。私はそれを参照してください
方法、あなただけのいくつかのオプションがあります。
- 角度で編集可能/編集不可能なテンプレートを作成し、 正しいテンプレートを取得します。
- は、ディレクティブを作りますそれは編集可能なビューを交換します 編集モードでは、編集不可能なビュー(またはその逆)に対してかみそりのテンプレートへ
- 変換テンプレートとは、編集ビューと
- はかみそりのテンプレートにテンプレートを変換し、ヘルパーは、あなたが希望するビューを作成してい 非編集ビューを持っています。
コメント後、#3または#4が好きなようです。 #4は1つのファイルだけを変更することができますが、両方のビューに影響を与えることができる1つのかみそりのテンプレート(私のような)を作成します。これは参考になるかもしれませんが、編集/非編集ビューのマークアップがどの程度一貫しているかによって異なります。
例テキストボックスと共通のベース要素のヘルパー(オプション#4)@Bryanが、それは私が行うにはしたくないものを効果的だ、私はクライアント上で編集可能なHTMLをしたくない
public static MvcHtmlString TextboxFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var dict = new RouteValueDictionary(htmlAttributes ?? new object { });
var tag = new TagBuilder("span");//default view
if((bool) helper.ViewContext.Controller.ViewBag.CanEdit){//edit view
tag = new TagBuilder("input");
tag.Attributes.Add("class", "form-control");
if (!dict.ContainsKey("type"))
{
tag.Attributes.Add("type", "text");//default input type
}
}else
{
var value = ModelMetadata.FromLambdaExpression(
expression, helper.ViewData
).Model;
tag.InnerHtml = value.ToString();
}
return BaseNode(helper, expression, tag, TagRenderMode.SelfClosing, dict);
}
public static MvcHtmlString BaseNode<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, TagBuilder tag, TagRenderMode tagRenderMode, RouteValueDictionary dict)
{
var name = ExpressionHelper.GetExpressionText(expression);
var fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
var id = TagBuilder.CreateSanitizedId(fullName);
var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
tag.Attributes.Add("name", fullName);
tag.Attributes.Add("id", id);
foreach (var dKey in dict.Keys)
{
var value = dict[dKey].ToString();
var key = dKey.Replace("_", "-");
tag.Attributes.Add(key, value);
}
return new MvcHtmlString(tag.ToString(tagRenderMode));
}
おかげで、これは、JSの知識を持つクライアントが変数を設定する機能を持つクライアントに許可し、編集可能なビューを持っています(これはあなたの投稿から得られたものです)。テンプレートの多くを剃刀に変換する以外に、それをするの? –
@BobSあなたが私が見ているすべてのオプションと、私が使っているコードのいくつかを与えるために私の答えを更新しました(あなたがやりたいと思うものに合わせて修正しました) –
Bryanに感謝、ベットしますが、私は非常に興味深い4つを調査します... –