2016-10-21 6 views
0

私はC#MVC初心者だと言って始めますが、Identity Managementを使用してサイトを設定し、追加のカスタムテーブルを使用してデータベースを拡張しました私のユーザーに関する情報なので、私は完全な新生児ではありません。私は新しいWebサイトから展開したいVB WPFアプリケーションに取り組んできましたが、これが問題に取り組んでいます。clickonce Setup.exeのMVCをダウンロードして確認表示を表示

私は新しいコントローラ(User)といくつかのビュー(Download)&(Setup)を作成しました。私は、ダウンロードビューで使用されるダウンロードモデルを作成しました。

私がやっていることは、ユーザーが概要、インストール、および利用規約を読んだことを確認する3つのチェックボックスがあるダウンロードビュー(取得)を表示することです。これらはモデルのブール値です。また、モデルに文字列応答メッセージがあり、送信ボタンのすぐ上に表示されます。こちらのモデルは次のとおりです。

public class DownloadModel 
{ 
    public bool Overview { get; set; } 
    public bool Installation { get; set; } 
    public bool TermsOfService { get; set; } 
    public string Response { get; set; } 

    public DownloadModel() 
    { 
     Overview = false; 
     Installation = false; 
     TermsOfService = false; 
     Response = "After checking boxes click the button to begin installation"; 
    } 

} 

マイユーザコントローラは、最初にダウンロードビューを表示するには、Get処理し、それは、応答メッセージとリターンを更新しない場合、その後のポストでは、すべてのチェックボックスがチェックされたかどうかを確認します景色。 チェックボックスがすべてオンになっている場合は、サブスクライバ(アカウントコントローラを介して電子メールを確認したときに作成されたため存在する必要があります - アイデンティティ管理)を引き出し、または最後にダウンロードした日付です。この時点で、セットアップビューを返す前に、clickonce setup.exeファイルのダウンロードを開始したいと考えています。

[Authorize] 
public class UserController : Controller 
{ 
    // GET: User/Download 
    public ActionResult Download() 
    { 
     return View(new DownloadModel { }); 
    } 

    // Post: User/Download 
    [HttpPost] 
    public ActionResult Download(DownloadModel downloadcheck) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(downloadcheck); 
     } 

     //check to see if all the boxes were checked 
     if (downloadcheck.Overview == true & 
         downloadcheck.Installation == true & 
         downloadcheck.TermsOfService == true) 
     { 
      //yes - so let's proceed 
      //first step is to get the subscriber 
      Subscriber tSubscriber = new Subscriber(); 
      tSubscriber.Email = User.Identity.Name; 
      bool okLoad = tSubscriber.LoadByEmail(); 
      if (okLoad == false) 
      { 
       //we have a real problem. a user has logged in but they are not yet 
       //a valid subscriber? 
       throw new Exception("Subscriber not found"); 

      } 

      // update subscriber with download in process... 
      if (tSubscriber.OriginalDownload == DateTime.MinValue) 
      { 
       tSubscriber.OriginalDownload = DateTime.Now; 
       tSubscriber.LastDownload = tSubscriber.OriginalDownload; 
      } 
      else 
      { 
       tSubscriber.LastDownload = DateTime.Now; 
      } 
      if (tSubscriber.UpdateDownloaded() == false) 
      { 
       //update of download dates failed 
       //another problem that shouldnt occur. 
       downloadcheck.Response = "A problem occured downloading your setup." 
        + "Try again. If this error continues please contact support."; 
       return View(downloadcheck); 
      } 

      //download dates have been updated for the subscriber so let's start the download! 

      //THIS IS WHERE I NEED TO BEGIN THE DOWNLOAD 

      return View("Setup"); 
     } 
     else 
     { 
      // all boxes were not checked - update message 
      downloadcheck.Response = "Please confirm you have reviewed the above information " 
       + "by checking all of the boxes before clicking on the button."; 
      return View(downloadcheck); 
         } 

    } 


} 

ダウンロードビューはかなり単純で、セットアップビューはダウンロードが開始されたことを確認して、ヘルプセットアップページへのリンクを提供します。

私は本当にここで少し失われています。私は新しいファイルパスレスポンスを返すと思っていましたが、それを行い、セットアップビューを返すことはできません。

私の他の考えは、返されるときに何とか/xxx/setup.exeのダウンロードをトリガすることでしたが、これを達成する方法については迷っています。

私のmvcのC#コードが過度に冗長で、私のやり方に対する私のアプローチは全く間違っているかもしれませんが、私はこれを実行してデプロイすることができます私のWPFアプリケーションは、テストのためにベータユーザーを選択する。それは貯蓄から生きている長い時間を過ごしており、私はここから生きることができます。

最後に、ネットとlocalsqldbの前提条件があるため、私のwpfアプリのsetup.exe clickonceのデプロイメントを使用していますが、自動更新は使用しません。

すべての入力とアドバイスを歓迎します。

答えて

0

これ以上の掘削とハッキングの後、私はうまくいくソリューションを見つけました。まず、私のセットアップビュー(確認ページ)に私は私のユーザーのコントローラに新しい機能を開始するために簡単なスクリプトを追加しました:

<script type="text/javascript"> 
    window.location.href = "/user/sendfile/" 
</script> 

コントローラの変化があまりにも簡単でした。テストのために私はちょうどtxtファイルを使用しました。

// User/SendFile 
    public ActionResult SendFile() 
    { 
     string path = @"~/xxxx/anyfile.txt"; 
     string content = "application/txt"; 
     //string content = "application/x-ms-application"; 
     return new FilePathResult(path, content) 
     { 
      FileDownloadName = "mynewtext.txt" 
     }; 
    } 

このソリューションについて実際に興味深いのは、FileDownloadNameはファイルコンテンツがダウンロードされるものです。このようにして、パス内の実際のsetup.exeファイルを参照することができます。Bonus :)

+0

これはテストテキストファイルの場合と同じように機能しますが、WPFアプリケーションのclickonceデプロイメントからsetup.exeファイルに切り替えると、さらに問題が発生しました。ダウンロードして実行し、前提条件をインストールしましたが、xxx.applicationファイルが見つかりませんでした。私は次の週にこれについて作業を続け、答えが出たら直ちにアップデートを投稿します。 – Scott

+0

OK - これを解決しました。 1)公開/インストールフォルダが、アプリケーションがアップロードされた正しいhttp:// xxxxフォルダに設定されていることと、2)公開/更新/更新場所フォルダも同じフォルダに設定されていることを確認します自動更新を使用していなくても)。 Setup.exeにはxxx.applicationフォルダがあり、あなたはうまくいくでしょう。 – Scott

関連する問題