Formdata对象正在转换为ASP.NET MVC

时间:2019-01-03 07:50:55

标签: javascript c# jquery html asp.net-mvc

我正在将formdata数据发送到MVC控制器,但是当我发送请求时,有时formdata会转换为查询字符串或缺少某些值。

当我在Chrome中调试代码时,请求会发送到服务器,但有时请求中不会包含城市ID和图像。

这是我的jQuery添加函数:

   function add()
    {

        var formdata = new FormData(); 
        var imagefile = $('#imageuploaded')[0].files[0];

        formdata.append('name', $('#name').val());
        formdata.append('lastname', $('#lastname').val());
        formdata.append('address', $('#address').val());
        formdata.append('imageuploaded', imagefile);

        for (var i = 0; i < formvalues.cityid.length; i++)
        {
            formdata.append('cityid['+i+']', formvalues.cityid[i]);

        }

        $.ajax({

            url: "/Practice/insertemployee",
            type: "Post",
            contentType: false,
            processData: false,
            data: formdata,
            success: onsccessinsert,
            error:onerrorinsert

        });
    }

我的控制器:

 public JsonResult insertemployee(People people,HttpPostedFileBase 
imageuploaded)
    {
         var name= imageuploaded.FileName;
         var folderpath = Server.MapPath(@"\Images\");
        string guid = new Guid().ToString();
        var fullpath = folderpath +guid+ name;
        people.fullimagepath = fullpath;
        people.shortimagepath=@"\Images\"+guid+name;
        imageuploaded.SaveAs(fullpath);
        return Json(PracticedbcontexController.insertintodb(people), JsonRequestBehavior.AllowGet);
    }

最后,视图标记:

<form id="peopleform"   enctype="multipart/form-data" >
<div class="form-group">
        <input type="hidden" id="id" />
        <label>name</label>
        <input type="text" class="form-control" id="name" name="name" />
    </div>
    <div class="form-group">
        <label>lastname</label>
        <input type="text" class="form-control" id="lastname" name="lastname" />
    </div>
    <div class="form-group">
        <label>address</label>
        <input type="text" class="form-control" id="address" name="address" />
    </div>
    <select id="listofcities"  onchange="citiesselected()">
        <option value="1">karachi</option>
        <option value="2">hyderabad</option>
        <option value="3">larkana</option>
    </select>
    <div class="form-group">
        <input type="file" id="imageuploaded" name="imageuploaded" class="form-control" />
    </div>
    <ul id="cityid"></ul>
    <button id="submitform" class="btn btn-primary" onclick="add()">submit</button>
</form>

当我将请求发送到服务器时,请求将转换为查询字符串而不是formdata对象。当我调试并发送请求时,它似乎丢失了一些数据。我检查了所有附加到formdata的值。

2 个答案:

答案 0 :(得分:1)

我有几点建议:首先,您可能想使用更通用的方法,因此添加了peopleView.cshtml(放置表单的位置),peopleController.cs和peopleViewModel.cs(封装数据的位置),现在您有了人类)。然后,您就拥有了,它应该发挥了神奇作用。但是我不确定文件输入部分。因此,据我了解,如果您使用FormData(),则控制器必须将每个值用作参数。因此,您可以将每个值或值放在单独的参数中,例如

public JsonResult insertemployee(string name, string lastname, HttpPostedFileBase 
imageuploaded, etc...)

或者您在javascript方面将所有与人相关的数据封装为人对象:

    var formdata = new FormData(); 
    var imagefile = $('#imageuploaded')[0].files[0];

    var people = {
       'name' = $('#name').val(),
       'lastname' = $('#lastname').val()
    };

    formdata.append('people', people);
    formdata.append('imageuploaded', imagefile);

通过具有“名称”和“姓氏”参数的方式,将“名称”重命名为“名字”以更加一致。

其他:

所以我对长get字符串的最佳猜测是,在调用post时遇到一些错误后,它尝试返回并使用get方法填充表单。这就是为什么提交后您返回表单和url具有所有值的原因。您的控制器应具有两个方法/动作(它们可能具有相同的名称,但具有不同的方法属性[HttpGet]和[HttpPost])。在发生错误的后期处理中,您应该返回View()并以已发布的模型作为参数。我建议您看一些MVC教程,以更好地理解和研究良好的模式和命名约定。

答案 1 :(得分:-1)

也许对您有帮助:

var url = "/Practice/insertemployee";

var imagefile = $('#imageuploaded')[0].files[0];
var name = $('#name').val();
var lastname = $('#lastname').val();
var address = $('#address').val();

var formdata = new FormData();
formdata.append('name', name);
formdata.append('lastname', lastname);
formdata.append('address', address);
formdata.append('imageuploaded', imagefile, imagefile.name);

for (var i = 0; i < formvalues.cityid.length; i++)
{
    formdata.append('cityid['+i+']', formvalues.cityid[i]);
}

$.ajax({
    url: url,
    type: "POST",
    data: formData,
    mimeType: "multipart/form-data",
    contentType: false,
    cache: false,
    processData: false,
    success: onsccessinsert,
    error: onerrorinsert
});

要添加文件,请使用以下结构:

formdata.append('imageuploaded', imagefile, imagefile.name);

并将mimetype设置为:

mimeType: "multipart/form-data",

这将帮助您丢失文件。