2012-12-08 16 views
5

私はカスタムモーダルポップアップを使用してサーバー上にPDFファイルをアップロードするためのアプリケーションを開発しています。私はファイルをアップロードしています.pdfファイルをアップロードするにはブラウザのHTMLコントロールをアップロードしています。このコントロールはパーシャルビューで設計されています。 「追加」ボタンをクリックしてサーバー側でHttpPostedFileBaseとFormCollectionの値を取得しませんでした。ここでHttpPostedFileBaseは常にpartialviewでnullです

私のコードです:

部分図:

@model Zytron.Models.ProductDataControls 

    @using (Html.BeginForm("UploadFiles", "AdminPanel", FormMethod.Post, new 
    { 
     @id = "file_upload", 
    })) 

    { 

     <table width="100%" cellpadding="5" cellspacing="1"> 
      <tr> 
       <td> 
        <span>Description</span> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        @Html.TextBoxFor(m => m.Description, new 
       { 
        @class = "textBox" 
       }) 
        @Html.HiddenFor(m => m.ProductId) 
        @Html.HiddenFor(m => m.ParentId) 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <span>File Source</span> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input type="file" id="fileUpload" name="fileUpload" size="23" /> 
       </td> 
      </tr> 
     </table> 
    } 

モデルのコード:

public class ProductDataControls 

{ 



     public string Description { get; set; } 

    } 

カスタムモーダルポップアップコード:

function loadProdAttachFile(tag, event, target) 
{ 
    event.preventDefault(); 
    var $loading = $('<img src="@Url.Content("~/Images/ajaxLoading.gif")" alt="loading" class="ui-loading-icon">'); 
    var $url = $(tag).attr('href'); 
    var $title = $(tag).attr('title'); 
    var $dialog = $('<div></div>'); 
    $dialog.empty(); 
    //   alert($url); 
    $dialog 
      .append($loading) 
      .load($url) 
       .dialog({ 
        autoOpen: false 
       , title: $title 
       , width: 500 
       , modal: true 
       , minHeight: 220 
       , show: 'fade' 
       , hide: 'fade' 
       }); 

       $dialog.dialog("option", "buttons", { 
        "Add": function() { 
         var dlg = $(this); 
         //$('form#file_upload').submit(); 

         var file = document.getElementById("fileUpload").value; 
         var pid = getParamValue("pid", $url); 
         var type = getParamValue("type", $url); 

         $.ajax({ 
          url: '/AdminPanel/UploadFiles', 
          type: 'POST', 
          data: { 'file': file, 'pid' : pid, 'type' : type }, 
          success: function (response) { 
           dlg.dialog('close'); 
           dlg.empty(); 
          }, 
          error: function (xhr) { 
           if (xhr.status == 400) 
            dlg.html(xhr.responseText, xhr.status);  /* display validation errors in edit dialog */ 
           else 
            displayError(xhr.responseText, xhr.status); /* display other errors in separate dialog */ 
          } 
         }); 

        }, 
        "Cancel": function() { 
         $(this).dialog("close"); 
         $(this).empty(); 
        } 
       }); 
    $dialog.dialog('open'); 
}; 

コントローラーコード:

[HttpPost] 

public void UploadFiles(HttpPostedFileBase file, FormCollection form) 
{ 
} 

コードの表示:

<a href "/ UploadFiles” class="ModalDlgProdAttachment" <img src=”../Images/MyImage.jpg" /> </a> 

$('a. ModalDlgProdAttachment).live("click", function (event) { loadProdAttachFile(this, event, "# file_upload"); }); 

答えて

2

あなたはAJAXを使用してファイルをアップロードすることはできません。これはStackOverflowで何度も議論されています。

  • 使用しているクライアントブラウザがHTML5 File APIをサポートしている場合は、AJAXを使用してファイルをアップロードすることができます。
  • サポートしていない場合は、Uploadify,BlueImp File UploadValums File Uploaderなどのファイルアップロードコンポーネントを使用できます。これらのコントロールは、クライアントブラウザがHTML5をサポートしているかどうかをテストし、使用されている場合、隠されたiframeやFlashムービーを使用する他のテクニックにフォールバックしないかどうかをテストします。
0

あなたはAJAXなしでそれをしたい場合は、あなたがあなたのformタグ内<input type="file" />を使用してファイルをアップロードしHttpPostedFileBaseとして行動でそれを取得することができます。

@using (Html.BeginForm("UploadFiles", "AdminPanel", FormMethod.Post, new { @id = "file_upload", enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="uploadedFile" /> 
} 

アクション署名を:

[HttpPost] 
public ActionResult UploadFiles(HttpPostedFileBase uploadedFile, SomeOtherViewModel stuff) 

しかし、ダーリンが言ったように、これが唯一の本当に一度に一つのファイルを処理し、処理しませんちょうどあなたがオブジェクトあなたのルート値にenctypeパラメータを追加しますAJAX呼び出し。

2

入力エレメントの 'name'属性が、 'UploadFiles'メソッドのHttpPostedFileBaseパラメータの名前と同じであることを確認する必要があります。これは、MVCがアップロードされたファイルをメソッドとマッチングする方法です。

関連する問題