2017-03-31 98 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;'这会阻止默认提交 –