2012-03-08 14 views
0

私は、複数のビューを提供できるコントローラアクションメソッドがあります。これらのビューはXSLTによって生成されます。Asp.Net MVCのルーティングと複数のビュー

ここでは、ビューにはイメージがあり(数百個ずつ)、それぞれのビューには参照するイメージのある独自のフォルダが必要です。これはどのように機能しますか?

ソースXMLのイメージに単純な相対パス( "images/image.svg")のhrefがある場合、このパスをアプリケーションのビューで解決するにはどうすればよいですか?

イメージフォルダをビューと同じフォルダに置いてそこに相対パスを使用することは簡単ですが、動作から複数のビューを提供しているため動作しません。ここでは、ルーティングは次のとおりです。

routes.MapRoute(
       "Parameter", 
       "{controller}/{action}/{lang}/{prod}", 
       new { controller = "Manuals", action = "Product", lang = "en-US", prod = "sample" } 
     ); 

私はのimg src属性の相対パスを使用してみてくださいあれば、それは「/Manuals/Product/en-US/images/image.svg」のようなものに解決

実際、ビューに相対的に置くと、画像は "/Views/Manuals/en/US/images/image.svg"に配置されます。

このように、相対的な画像パスを持つ方法はありませんAsp.Net MVCでこれは?またはMVCルーティングを誤解していますか?

public class MvcApplication : HttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     MapRoute(routes, "", "Home", "Index"); 
     /* other routes */ 
     MapRoute(routes, "{*url}", "Documentation", "Render"); 
    } 
} 

今すぐ一致していない任意のルートがDocumentationControllerに渡されます。

答えて

0

これは私が前にやっていることです。私のドキュメントコントローラは次のようになります。

これはマークダウンファイルを見つけてそれに応じてレンダリングすることです。あなたのケースのためにこれを更新するには、次の手順を実行する必要があります。

routes.MapRoute(
      "Parameter1", 
      "{controller}/{action}/{lang}/{*url}", 
      new { controller = "Manuals", action = "Download", lang = "en-US", prod = "sample" } 
    ); 

それは{controller}/{action}/{lang}/{prod}ルートの後であることを確認してください。これにより、/Manuals/Product/en-US/images/image.svg、またはimages/image.svgなどのURLが生成されます(ブラウザが/Manuals/Product/en-US/sampleの場合は、Downloadアクションを呼び出す必要があります)。次に、このURIを実際の場所にマップするコードを変更できます。 「イメージは」生成物であるとみなされ、その/Manuals/Product/en-US/imagesはそのに製品を思うだろう。

画像のアクションは、次のように見ることができますすることができます。

public ActionResult Download(string url) 
{ 
    /* figure out physical path */ 
    var filename = /* get filename form url */ 
    var fileStream = [...]; 
    Response.Headers.Remove("Content-Disposition"); 
    Response.Headers.Add("Content-Disposition", "inline; filename=" + filename); 
    string contentType = "image/jpg"; 
    return File(fileStream, contentType, filename); 
} 

あなたはMSDNでFileResultのより多くの情報を得ることができます。

+0

ありがとう、でも私は私はあなたを正しく理解しているかどうかわからない...私は画像をダウンロード可能にしたくない。しかし、私が相対パスを使用すると、上で説明したように動作しません。 – Anders

+0

恐らくダウンロードは間違った "言葉遣い"です。 Downloadの更新版を参照してください。 ContentCompositionヘッダーをインラインに設定すると、ブラウザーはイメージをダウンロードするのではなく表示します。あなたは、URLから実際のパス名などを把握するためにいくつかの作業をしなければなりません。私はそれを明確にすることを望む。 – bloudraak

関連する問題