2016-04-12 13 views
0

画像をアップロードしようとするとこの問題が発生します。私は、送信ボタンをクリックすると、私は次のエラーを取得する:clickASPでの画像アップロードエラーMVC

は、私はそれが動作モーダルのparam withaut使用した場合、ウィンドウはモーダルではなく、非常に悪く見えます。

モデル:

public partial class Prod 
{ 
    public string PName { get; set; } 
    public byte[] PFile{ get; set; } 
} 

インデックスビュー:

@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" })){

@Html.ActionLink(" ", "Create", "Products", null, new { data_modal = "file", id = "btnCreate", @class = "btn btn-small btn-primary pull-right fa fa-cart-plus" })

@Html.ActionLink(" ", "Create", "Products", null, new { id = "btnCreate", @class = "btn btn-small btn-primary pull-right fa fa-cart-plus" })

}

ビューを作成します。

@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="modal-body"> 

     <div class="form-horizontal"> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

      <div class="form-group"> 
       @Html.LabelFor(model => model.PFile, "Plik", htmlAttributes: new { @class = "control-label col-md-3" }) 
       <div class="col-md-9"> 
        @Html.TextBoxFor(model => model.PFile, new { type = "file", name = "imageF" }) 
        @Html.ValidationMessageFor(model => model.PFile, "", new { @class = "text-danger" }) 
       </div> 
      </div> 

     </div> 

    </div> 

    <div class="modal-footer"> 
     <button class="btn" data-dismiss="modal">Anuluj</button> 
     <input class="btn btn-primary" type="submit" value="Zapisz" /> 
    </div> 
} 

コントローラー:

[HttpPost] 
     [AcceptVerbs(HttpVerbs.Post)] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Exclude = "PFile")] Prod pro, HttpPostedFileBase imageF) 
     {      
      if (ModelState.IsValid) 
      { 

        if (imageF != null) 
        { 
         pro.PName= imageF.ContentType; 
         pro.PFile= new byte[imageF.ContentLength]; 
         imageF.InputStream.Read(pro.PFile, 0, imageF.ContentLength); 
        } 


        db.Prods.Add(pro); 
        db.SaveChanges(); 
        return Json(new { success = true }); 

      } 

      return PartialView("Create", pro); 
     } 

modalform.js

$(function() {

$.ajaxSetup({ cache: false }); 

$("a[data-modal]").on("click", function (e) { 

    // hide dropdown if any 
    $(e.target).closest('.btn-group').children('.dropdown-toggle').dropdown('toggle'); 


    $('#myModalContent').load(this.href, function() { 


     $('#myModal').modal({ 
      /*backdrop: 'static',*/ 
      keyboard: true 
     }, 'show'); 

     bindForm(this); 
    }); 

    return false; 
}); 

});

function bindForm(dialog) {

$('form', dialog).submit(function() { 
    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     contentType: 'multipart/form-data', 
     success: function (result) { 
      if (result.success) { 
       $('#myModal').modal('hide'); 
       //Refresh 
       location.reload(); 
      } else { 
       $('#myModalContent').html(result); 
       bindForm(); 
      } 
     } 
    }); 
    return false; 
}); } 

これを解決するために助けてください。

+0

あなたがajaxを投稿したときにフォームのエンコードタイプが失われましたか? –

+0

申し訳ありません、私は初心者です、あなたはその意味を理解していません – Ebasse

+0

フォームにenctype multipart/form-dataを追加したのですが、代わりにajaxポストを使ってファイルを送信しても、エンコードタイプ。 –

答えて

0

HttpPostedFileBaseオブジェクトの名前をBind属性に含めてみてください。あなたがそこに置かないものは、リクエストから除外されます。 このように:

public ActionResult Create([Bind(Exclude = "PFile", Include = "imageF")] Prod pro, HttpPostedFileBase imageF) 
+0

変更なし。私はprobファイルがJSファイルにあると思っています – Ebasse

+0

申し訳ありませんが、私は私の答えを更新します。あなたは変更を含まないで除外する –

+0

を使用する必要があります。私のコードは.jsファイルから使用されるdata_modal paramなしで動作します。このパラメータを追加するとエラーNull例外 – Ebasse

0

これを確認してください。まず、ajax呼び出しでファイルを投稿することはできません。サーバー側にファイルを投稿するには、完全なポストバックが必要です。 ajax呼び出しからファイルを処理するいくつかの他のテクニックがあります。

このコードをチェックしてください。

コントローラ機能。

public ActionResult Create(Prod pro) 
    { 
     if (ModelState.IsValid) 
     { 

      if (pro.PFile != null) 
      { 
       pro.PName = pro.PFile.ContentType; 
       pro.PFileByte = new byte[pro.PFile.ContentLength]; 
       pro.PFile.InputStream.Read(pro.PFileByte, 0, pro.PFile.ContentLength); 
      } 


      //db.Prods.Add(pro); 
      //db.SaveChanges(); 
      return Json(new { success = true }); 
     } 
     return PartialView("Create", pro); 
    } 

のViewModel ...

public partial class Prod 
{ 
    public string PName { get; set; } 
    public byte[] PFileByte { get; set; } 
    public HttpPostedFileBase PFile { get; set; } 
} 

フォームが機能を提出し、確認してください削除。 ajax呼び出しが必要な場合は、コメントを教えてください。

+0

このコードを変更してフォームを送信すると、エラーNull例外が発生します。独立またはモーダルパラメータであるか否かを判定する。 .jsファイルを変更する方法を教えてください。 – Ebasse

+0

もう一つの方法は、ファイルをbase64stringの形式でモデルの中に送ることです。 javascript内のファイルをバッファーとして読み込み、base64stringに変換します。この文字列をコントローラーの動作に簡単に送ることができます。コントローラ上で、このbase64をバッファ配列に変換します。上記のコードは、ajax呼び出しを使用しない場合に機能する必要があります。 – Saif

+0

私はコードのサンプルを与えることができますか? – Ebasse

0

私の悪い英語を前もって申し訳ありません!

このフォームでは、ajaxを使用する必要はありません。 PNameまたはモデルへの入力が隠されていることを確認して、コントローラーへの送信は無効になります。データベースにデータを追加するためのIDが必要なので、モデルに追加し、変数proに有効なID(数値)が設定されていることを確認してください。

コントローラでファイルをアップロードしてみてください。必要なものを返すようにしてください! :

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Exclude = "PFile,PName")] Prod pro) 
{      
    if (ModelState.IsValid) 
    {  
     try 
     { 
      if (Request.Files[0] != null && Request.Files[0].ContentLength > 0) 
      { 
       byte[] tmp = null; 
       using (var bin = new BinaryReader(Request.Files[0].InputStream)) 
       { 
        tmp = bin.ReadBytes(Request.Files[0].ContentLength); 
       } 
       pro.PName = Request.Files[0].ContentType; 
       pro.PFile = tmp; 
      } 
     } 
     catch { 
      throw new Exception("There is no file to upload."); 
      // TODO Change the exception to this if your want your PFile and PName to be null if there's no file. 
      // pro.PName = ""; 
      // pro.PFile = null; 
     } 
     db.Prods.Add(pro); 
     db.SaveChanges(); 
     return RedirectToAction("Index", "Whatever"); 
    } 
    return PartialView("Create", pro); 
} 
+0

私は自分のコードのようなモーダルフォームなしで開くときにのみ動作します。 私はモーダルフォームのパラメータで使用するとき、私はこのエラーがあります: インデックスが範囲外です。負でなく、コレクションのサイズより小さくなければなりません。 – Ebasse

+0

@Ebasse okですので、ajaxでformDataを使って送信してみてください! ajaxでC#メソッドにファイルを送る良い方法です! – AlwaysBeShels