C# 在服务器端访问ajax post表单数据

C# 在服务器端访问ajax post表单数据,c#,jquery,ajax,asp.net-mvc-4,post,C#,Jquery,Ajax,Asp.net Mvc 4,Post,我试着在上传文件的同时发布一些数据。作为第一步,我尝试将希望在服务器端检索的所有数据作为参数传递。即使我成功地检索到参数“Mode”的值。我从未收到参数“file”的值。我不知道为什么 以下是我的代码: 控制器: public ActionResult ReadFromExcel(HttpPostedFileBase file, bool Mode) { // file is always null // Mode receives the correct values. }

我试着在上传文件的同时发布一些数据。作为第一步,我尝试将希望在服务器端检索的所有数据作为参数传递。即使我成功地检索到参数“Mode”的值。我从未收到参数“file”的值。我不知道为什么

以下是我的代码:

控制器:

public ActionResult ReadFromExcel(HttpPostedFileBase file, bool Mode)
{
    // file is always null
    // Mode receives the correct values.
}
public ActionResult ReadFromExcel()
{
    var file = Request.Files[0].
    // file contains the correct value.
    // Unable to retrieve mode value though.
}
脚本:

$(document).ready(function () {
$("#ReadExcel").click(function () {

    var overwritefields = $("#overwritefields").is(":checked");


    $.ajax({
        type: "POST",
        url: 'ReadFromExcel',
        data: '{"file":"' + document.getElementById("FileUpload").files[0] + '","Mode":"' + overwritefields + '"}',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response) {
            // Refresh data

        },
        error: function (error) {
            alert("An error occured, Please contact System Administrator. \n" + "Error: " + error.statusText);
        },
        async: true
    });
});
$(document).ready(function () {
$("#ReadExcel").click(function () {

    var formData = new FormData();
    formData.append("FileUpload", document.getElementById("FileUpload").files[0]);


    var overwritefields = $("#overwritefields").is(":checked");
    formData.append("Mode", overwritefields);


    $.ajax({
        type: "POST",
        url: 'ReadFromExcel',
        data: formData,
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response) {
            // Refresh data

        },
        error: function (error) {
            alert("An error occured, Please contact System Administrator. \n" + "Error: " + error.statusText);
        },
        async: true
    });
});
然后我尝试通过Request.file[0]访问该文件,这在一定程度上是成功的。但如何检索其他表单数据(如“Mode”)的值呢

以下是我的代码:

控制器:

public ActionResult ReadFromExcel(HttpPostedFileBase file, bool Mode)
{
    // file is always null
    // Mode receives the correct values.
}
public ActionResult ReadFromExcel()
{
    var file = Request.Files[0].
    // file contains the correct value.
    // Unable to retrieve mode value though.
}
脚本:

$(document).ready(function () {
$("#ReadExcel").click(function () {

    var overwritefields = $("#overwritefields").is(":checked");


    $.ajax({
        type: "POST",
        url: 'ReadFromExcel',
        data: '{"file":"' + document.getElementById("FileUpload").files[0] + '","Mode":"' + overwritefields + '"}',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response) {
            // Refresh data

        },
        error: function (error) {
            alert("An error occured, Please contact System Administrator. \n" + "Error: " + error.statusText);
        },
        async: true
    });
});
$(document).ready(function () {
$("#ReadExcel").click(function () {

    var formData = new FormData();
    formData.append("FileUpload", document.getElementById("FileUpload").files[0]);


    var overwritefields = $("#overwritefields").is(":checked");
    formData.append("Mode", overwritefields);


    $.ajax({
        type: "POST",
        url: 'ReadFromExcel',
        data: formData,
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response) {
            // Refresh data

        },
        error: function (error) {
            alert("An error occured, Please contact System Administrator. \n" + "Error: " + error.statusText);
        },
        async: true
    });
});
以下是我的看法:

@model IPagedList<Budget>

@{
ViewBag.Title = "Import Budget Line Items From Excel";
var tooltip = new Dictionary<string, object>();
tooltip.Add("title", "Click to import budget line items from Excel");

int pageSize = 10;
string sortname = "ItemCode";
string sortorder = "asc";
string filter = "";
bool hasFilter = false;
if (Session["BudgetImportGridSettings"] != null)
{
    //
    // Get from cache the last page zise selected by the user.
    //
    Impetro.Models.Grid.GridSettings grid = (Impetro.Models.Grid.GridSettings)Session["BudgetImportGridSettings"];
    pageSize = grid.PageSize;
    sortname = grid.SortColumn;
    sortorder = grid.SortOrder;
    filter = grid.HasFilter ? grid.FilterString : "";
    hasFilter = grid.HasFilter && grid.Filter.rules.Count > 0;
}

}


<h2>@ViewBag.Title</h2>


<br style="clear: both;" />
<input type="file" id="FileUpload" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
<span class="buttonspan backtolist" id="ReadExcel" title="Click to import budget line items from Excel"><a href="#" title="Click to import budget line items from Excel">Import</a></span>
<br style="clear: both;" />
<br style="clear: both;" />
<input type="checkbox" id="overwritefields" title="Overwrite other fields with imported non-blank data" class="chkclass" value=false />

<br style="clear: both;" />
<br style="clear: both;" />

@Html.Partial("_BudgetImportGrid")
<input type="hidden" value="@ViewBag.BudgetType" id="IntBudgetType" />
@model IPagedList
@{
ViewBag.Title=“从Excel导入预算行项目”;
var tooltip=newdictionary();
工具提示。添加(“标题”,“单击从Excel导入预算行项目”);
int pageSize=10;
字符串sortname=“ItemCode”;
字符串sortorder=“asc”;
字符串过滤器=”;
bool-hasFilter=false;
如果(会话[“BudgetImportGridSettings”]!=null)
{
//
//从缓存中获取用户选择的最后一页zise。
//
Impetro.Models.Grid.GridSettings Grid=(Impetro.Models.Grid.GridSettings)会话[“BudgetImportGridSettings”];
pageSize=grid.pageSize;
sortname=grid.SortColumn;
sortorder=grid.sortorder;
filter=grid.HasFilter?grid.FilterString:“”;
hasFilter=grid.hasFilter&&grid.Filter.rules.Count>0;
}
}
@视图包。标题





@Html.Partial(“_BudgetImportGrid”)
一个简单的方法就是将
bool模式添加到动作方法中:

public ActionResult ReadFromExcel(bool Mode)
{
    //Use the selected Mode...

    var file = Request.Files[0].
    // file contains the correct value.
    // Unable to retrieve mode value though.
}

我希望您可以使用HTML5文件读取器API。以下解决方案使用它:

我从头开始构建了您的场景,以确保我的建议有效

总结:

  • bool模式
    作为动作方法参数。它使用查询字符串提供给服务器
  • 作为请求正文的一部分以二进制形式上载的文件。二进制数据是使用FileReader HTML5 API获得的。这是明显的HTML5部分,如果您可以替换它,那么您可能会得到HTML5依赖性
  • AJAX是一个POST请求 使用以下JavaScript:

    $(function(){
        $("#upload").click(function () {
            var overwritefields = $("#overwritefields").is(":checked");
    
            var r = new FileReader();
            r.onload = function () {
                $.ajax({
                    type: "POST",
                    url: 'UploadFileWithBoolean?mode=' + overwritefields,
                    data: r.result,
                    contentType: 'application/octet-stream',
                    processData: false,
                    success: function (d) {
                        console.log("ok");
                        console.log(d);
                    },
                    error: function (d) {
                        console.log("fail");
                        console.log(d);
                    },
                    async: true
                });
            };
            r.readAsBinaryString(document.getElementById("FileUpload").files[0]);
        });
    });
    
    控制器方法:

    [HttpPost]
    public ActionResult UploadFileWithBoolean(bool mode)
    {
        //your file is now in Request.InputStream
        return Json(new { message = "mode is " + mode.ToString(), filesize = Request.InputStream.Length });
    }
    

    让我知道这是否有帮助。谢谢

    查看我的答案,如果您想让我提出其他建议,请告诉我。。hthI无法像您那样使用FormData。。。!因此,我使用FileReader如何将模式参数传递到服务器端?使用ASP.NETMVC框架!;)绑定是由框架自动完成的:它查看请求(从QueryString、表单数据、ajax数据等进行搜索)……因此只需将您的模式包含在ajax数据中即可。我将模式参数添加到操作方法中,并将值附加到表单数据中(var overwritefields=$(“#overwritefields”)。是否(“:checked”);formData.append(“Mode”,overwritefields);)。请求返回错误:500。url:“ReadFromExcel”是否需要任何更改?是否存在关于bool模式不能接受值null的服务器错误?这意味着它无法找到您的模式参数。您可以通过将bool模式更改为bool来测试这一点?模式