2017-03-31 30 views
0

在我看來,我有一個模式窗口,它有一個表單...MVC阿賈克斯防止重定向到動作控制器

@using (Html.BeginForm("controllerAction", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div class="container" id="editRecordForm"> 
     <div class="row"> 
      <div class="col-md-6"> 
       @Html.LabelFor(model => model.Author) 
       @Html.TextBoxFor(model => model.Author, new { @class = "form-control", @style = "height:auto" }) 
       @Html.ValidationMessageFor(model => model.Author) 
      </div> 
     </div> 
     <br/> 
     <div class="row"> 
      <div class="col-md-6"> 
       @Html.LabelFor(model => model.Image) 
       <input type="file" name="file" accept="image/*"> 
      </div> 
     </div> 
     <br /> 
     <input type="submit" value="Submit" class="btn btn-primary"> 
    </div> 
} 

這是包含Ajax請求的JS

<script> 
    var formdata = new FormData($('form').get(0)); 
    $('form').submit(function() { 
     if ($(this).valid()) { 
      $.ajax({ 
       url: this.action, 
       type: this.method, 
       cache: false, 
       data: formdata, 
       success: function (status, data) { 
        console.log(data); 
       } 
      }); 
     } 
     return false; 
    }); 
</script> 

動作控制器收到兩個參數模型和文件

[HttpPost] 
public async Task<JsonResult> controllerAction(HttpPostedFileBase file, Model model) 
{ 
    var json = new 
    { 
     Success = true, 
     StatusCode = "200", 
     ErrorDesc = "OK", 
     ErrorCode = "", 
     NewId = "" 
    }; 

    //some process 

    return Json(json, JsonRequestBehavior.AllowGet); 
} 

問題是爲什麼當控制器actio n完成後,它重定向到動作控制器網址

http://controller/action 

並且它不保留在同一頁上?

我在做什麼錯?

+0

聽起來像提交事件仍在傳播。你是否看到與$('form')相同的行爲?submit(function(e){'和'e.preventDefault()'? –

+0

你顯示的代碼不會重定向。 ajax方法永遠不會正確地發佈值,因爲你沒有設置正確的選項 - 你需要'processData:false,'和'contentType:false,' - 參考[this answer](http://stackoverflow.com/questions/29293637/how-to-append-whole-set-model-to-formdata-and-obtain-it-in-mvc/29293681#29293681) –

+1

並有'var formdata = new FormData($('form'))。 get(0));'在$('form')之前'submit(function(){'沒有任何意義 - 它在編輯任何東西之前序列化初始表單控件,但是沒有顯示相關的和/或正確的代碼來幫助(除非JavaScript已被禁用) –

回答

0

問題是在Javascript成爲阿賈克斯部分

$('form').submit(function() { 
    var formdata = new FormData($('form').get(0)); 
    if ($(this).valid()) { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      cache: false, 
      processData: false, 
      contentType: false, 
      data: formdata, 
      success: function (status, data) { 
       console.log(data); 
      } 
     }); 
    } 
    return false; 
}); 

感謝斯蒂芬的幫助壞的配置。

2

您無法阻止窗體的默認操作。

$('form').submit(function (e) { 
    e.preventDefault(); 
    if ($(this).valid()) { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      cache: false, 
      data: formdata, 
      success: function (status, data) { 
       console.log(data); 
      } 
     }); 
    } 
    return false; 
}); 
+0

OP已經有'return false;'這會阻止默認提交 –