2016-06-21 7 views
1

私はアドバイスをしています。現在、私はmvc 5プロジェクト、非常に薄いビューとコントローラを持ち、Web API 2を使用しています。これを、ブラウザのすべてのユーザーインタラクションクライアントサイドを扱う角度1.4で使用しています。ほとんどの取得と投稿は角度とWeb APIの間で処理されます。私はこのアプローチが好きです。共通のMVパターン、優れたJSフレームワーク、JSユニットテストなどの両方の世界を最大限に活用していると感じたら、このアプローチが好きです...ユーザーロールは2種類あり、編集可能他のロールは編集不可能なビューにアクセスできます。私はこれを達成するために角形のテンプレートの多くを剃刀に戻すことを考えており、誰かがこのためのきれいな戦略を持っているのか疑問に思っています。基本的に、ユーザーが特定のhtml要素にアクセスできない場合は、これらをワイヤーで送信したくないのです。編集可能なビューまたは編集可能でないビューに対して別々のmvcビューまたは角度テンプレートを作成する必要はありません。Asp.net mvc 5角度1.4ハイブリッドロックダウンビュー

ありがとうございます!

答えて

0

これは主観的であり、異なる意見になるでしょう。

これは私が編集と各モデルを見るための別個のビューを望んでいなかったのと同じ問題に直面していました。だから私はそれの内部に2つのコンポーネントで外側divが作成されたMVCヘルパーを作成しました。 1つは閲覧用、もう1つは編集用です。編集と表示の切り替えに共通の角度変数がありました。効果は、HTMLが大きいですが、cshtmlはまだ小さく、読みやすいです。

Bobのコメントでは、悪意のあるユーザーが編集可能なビューに手動で切り替えることは可能ですが、そのユーザーがアクセス権を持っていなければ変更を保存することはできません。更新/ポストを作成。私はそれを参照してください

方法、あなただけのいくつかのオプションがあります。

  1. 角度で編集可能/編集不可能なテンプレートを作成し、 正しいテンプレートを取得します。
  2. は、ディレクティブを作りますそれは編集可能なビューを交換します 編集モードでは、編集不可能なビュー(またはその逆)に対してかみそりのテンプレートへ
  3. 変換テンプレートとは、編集ビューと
  4. はかみそりのテンプレートにテンプレートを変換し、ヘルパーは、あなたが希望するビューを作成してい 非編集ビューを持っています。

コメント後、#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)); 
} 
+0

おかげで、これは、JSの知識を持つクライアントが変数を設定する機能を持つクライアントに許可し、編集可能なビューを持っています(これはあなたの投稿から得られたものです)。テンプレートの多くを剃刀に変換する以外に、それをするの? –

+0

@BobSあなたが私が見ているすべてのオプションと、私が使っているコードのいくつかを与えるために私の答えを更新しました(あなたがやりたいと思うものに合わせて修正しました) –

+0

Bryanに感謝、ベットしますが、私は非常に興味深い4つを調査します... –