2017-02-24 8 views
0

私はアイテムのリストを表示するビューを持っています。ユーザーが「編集」を選択したときに既存のアイテムを表示したり、ユーザーが「作成」をクリックしたときに新しいアイテムを表示したいとします。この「単一項目」ウィンドウは多くの異なる場所で呼び出されますので、「編集」と「作成」の機能を1つのビューに組み合わせることをお勧めします。私は、呼び出し元と同じレベルのビューページを作成し、このアイテムウィンドウで「送信」をクリックすると、アイテムコントローラがそのジョブを実行し、呼び出し元ページ(アイテムリストなど)にリダイレクトする発呼者)。しかし、私は別のアプローチを試してみたい。これは、このアイテムウィンドウをポップアップウィンドウとして作ることを望んでいる。ユーザが "show modal"ボタンをクリックすると、呼び出し側のページがコントローラへのajax呼び出しを行い、アイテムのデータ(またはそのid)パラメータを取得し、コントローラはMvcHtmlStringを動的に生成し、呼び出し側に戻り、受け取ったMvcHtmlStringを使用してポップアップウィンドウを表示します。すべてがうまくいくようですが、私のコントローラーの大量のhtmlコードは非常に乱雑です。MVC HtmlHelperメソッドを使用するコントローラのLaberFor()、EditorFor()

だから、私は、コントローラにHtml.LabelFor(item => item.Name)、またはHtml.EditorFor(item => item.Name)のようなものを行うことができますどのように、例えば、私は、オブジェクトタイプ「項目を」持って、コントローラにMvcHtmlStringを生成するのHtmlHelperを使用する方法を疑問に思うとMvcHtmlStringを取得していますか?

+1

なぜコントローラがhtmlを作成していますか? (Viewフォルダに定義されている)部分ビューを作成して、コントローラに部分ビューを返すことはできませんか? – Sparrow

+0

htmlで特別なことをしたい場合は、部分的な表示やテンプレートの表示を検討してください。 –

+0

[この質問](http://stackoverflow.com/q/26362910/215552)とビューの外にHTMLを構築する方法については、その回答を参照してください。 –

答えて

0

Htmlhelpersを拡張することができます。あなたがただ編集/作成ボタンを達成したいと思って、条件のためにあなたのviewmodelを変えることができる、または多分あなたは同じモデルを使用したいと思います。この拡張機能のように、私は現在私の意見を使っています。

public static MvcHtmlString CustomActionLink(this HtmlHelper html, string action, string controller, 
      string displayText, bool isCreate) 
     { 
      if (isCreate) 
      { 
       var targetUrl = UrlHelper.GenerateUrl("Default", action, controller, 
        null, RouteTable.Routes, html.ViewContext.RequestContext, false); 
       var anchorBuilder = new TagBuilder("a"); 
       anchorBuilder.MergeAttribute("href", targetUrl); 
       string classes = "btn btn-progress"; 
       anchorBuilder.MergeAttribute("class", classes); 

       //Return as MVC string 
       anchorBuilder.InnerHtml = displayText; 
       return new MvcHtmlString(anchorBuilder.ToString(TagRenderMode.Normal)); 
      } 
      else 
      { 
       var spanBuilder = new TagBuilder("span"); 
       spanBuilder.MergeAttribute("class", "btn btn-progress"); 
       spanBuilder.InnerHtml = displayText; 
       return new MvcHtmlString(spanBuilder.ToString(TagRenderMode.Normal)); 
      } 
     } 
+1

ありがとう!私は "TagBuilder"よりも優れたフォーマットを探しています。 HtmlHelper()を使うように、 ".Attribute"や ".InnerHtml"の量を減らすことができます。 – Chris

+0

あなたの歓迎:)あなたはその拡張のようなあなたのビューコードを減らすことができます。また、達成するために私の答えを承認することができます。ありがとうございました。 –

+0

私はやった。ありがとう – Chris

関連する問題