2017-07-29 2 views
0

UIクラスライブラリプロジェクトでの業務を処理するファイルを作成する方法

<input type = "file" title="Please upload some file" name="file" /> 

MVC

/*below method is called from a MVC controller 
this method resides for now in MVC project itself*/ 
public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file) 
    { 
     using (StreamReader sr = new StreamReader(file.FileName)) 
     { 
      { 
       file.saveAs("details.txt"); 
       string json = sr.ReadToEnd(); 
       IEnumerable<CustomerTO> customers= 
        JsonConvert.DeserializeObject<List<CustomerTO>>(json); 
       return customers; 
      } 
     } 
    } 

MVCプロジェクトで、上記の方法またはWebベースのプロジェクトのいくつかの種類が、すべての参照が罰金を見つけるです。

しかし、このような操作をすべて処理するユーティリティクラスを作成することを考えています。 は、だから私は今、私がするFileUploadは、UIコントロールHttpPostedFileこれに関連するすべての操作を処理している知っているクラスUtitlity.cs

クラスライブラリ

public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file) 
    { 
     //but HttpPostedFile is throwing error. 
     //NOTE Ideally,I shouldn't be saving the posted file 
    } 

を追加&クラスライブラリプロジェクトを作成しました。

私は簡単に参考文献using System.Webを追加することができますが、それは正しいのでしょうか?

しかし、私はどのようにオーバーヘッドの種類のない私の要件に対処しますか? メモリ割り当て、実行&このようなすべてのあなたは、コントローラのメソッドが正常に掲示ファイル参照を受けていることを確認した後

+0

ファイルの入力に 'name'属性がないので、最初の作業をどのように行うことができるかはわかりません。そのため、パラメータは' null'になります。そして、あなたは2番目の 'ユーティリティ'メソッドをどのように呼び出すのですか?リクエストを受け取るには 'Controller'にアクションメソッドが必要です。 –

+0

@StephenMuecke、申し訳ありません!不足している詳細を追加しました –

+0

パラメータ 'HttpPostedFile file'にバインドするには' name = "file" 'が必要です:) –

答えて

1

はこの回答を読んで非常に重要です。

System.Webの参照をクラスライブラリに追加する必要はありません。代わりに、ファイルの内容をリファクタリングされたメソッドに渡します。さらに、ユーティリティクラスを作成しているので、CustomerDTOだけでなく、どのタイプのDTOも返すことができることを確認してください。 Accountsファイルを渡し、AccountDTOを取得する必要がある場合は、同じクラス/メソッドを使用することができます。

実際に、任意の文字列コンテンツを任意のタイプにデシリアライズするために、そのコードを使用できるはずです。ここでGenericsを使用できます。コントローラにStreamReaderを使用してファイルの内容を読み込み

// Controller.cs 
public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file) 
{ 
    string fileContent; 
    using (StreamReader sr = new StreamReader(file.FileName)) { 
     file.saveAs("details.txt"); 
     fileContent = sr.ReadToEnd(); 
    } 

    var customers = JsonSerializer.Deserialize<List<CustomerTO>>(content); // Refactored 

    return customers; 
} 

// JsonSerializer.cs 
public static T Deserialize<T>(string content) { 
    // ... 
    return JsonConvert.DeserializeObject<T>(content); 
} 

をリファクタリングする必要はありません。それは不必要なIMOです。

+0

素晴らしいですが、私はファイルを保存することに言及したように私にはオーバーヘッドです –

+0

確かにユーザーはファイルをアップロードし、内容を読みとる必要があります。多くのファイルがオーバーヘッドでないことを保存する –

+0

アップロードしたファイルのコピーを保存しない場合は、保存せずに 'file.InputStream'を使用してください。問題の実際のシナリオを明確に示していることを確認してください。 – niksofteng

関連する問題