我正在将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的值。
答案 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",
这将帮助您丢失文件。