Asp.net Ajax表单在CSV上传时返回null
这种设置方式是, -有一个采用CSV上传的视图 -有一个控制器部分视图操作,它应该检索解析CSv并从CSv读取对象,然后将其传递回部分视图。 -局部视图应该在包含所有记录的页面上呈现 但显然,BulkClient对象显示为空 这是控制器:-Asp.net Ajax表单在CSV上传时返回null,asp.net,ajax,asp.net-mvc,asp.net-mvc-partialview,Asp.net,Ajax,Asp.net Mvc,Asp.net Mvc Partialview,这种设置方式是, -有一个采用CSV上传的视图 -有一个控制器部分视图操作,它应该检索解析CSv并从CSv读取对象,然后将其传递回部分视图。 -局部视图应该在包含所有记录的页面上呈现 但显然,BulkClient对象显示为空 这是控制器:- public ActionResult UploadBulkClients() { return View(); } // [HttpPost] public PartialViewResult _Upload
public ActionResult UploadBulkClients()
{
return View();
}
// [HttpPost]
public PartialViewResult _UploadBulkClients(HttpPostedFileBase bulkClients)
{
if (bulkClients != null)
{
try
{
StreamReader reader = new StreamReader(bulkClients.InputStream);
while (reader != null)
{
var csv = new CsvReader(reader);
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
newRecord.Add(new ClientAgencyViewModel()
{
Id = UrbanLighthouse.Shared.Statics.NewUniqueGUID(),
ReferenceNo = csv["ReferenceNo"].ToString(),
FirstName = csv["FirstName"].ToString(),
MiddleName = csv["MiddleName"].ToString(),
LastName = csv["LastName"].ToString(),
StreetAddress = csv["StreetAddress"].ToString(),
City = csv["City"].ToString(),
PostalCode = csv["PostalCode"].ToString(),
Province = Guid.Parse(csv["Province"].ToString()),
Phone = csv["Phone"].ToString(),
Email = csv["Email"].ToString()
});
}
foreach (var item in newRecord)
{
if (repository.DoesEmailExist(item.Email) == true)
{
item.Email = item.Email + " : " + "Invalid Email Address";
}
else
{
item.Email = item.Email + " : " + "This Email is Good";
}
}
}
return PartialView(newRecord);
}
catch (System.IO.IOException e)
{
return PartialView(e);
}
}
else
{
newRecord.Add(new ClientAgencyViewModel()
{
ReferenceNo = "Empty",
FirstName = "Empty",
MiddleName = "Empty",
LastName = "Empty",
StreetAddress = "Empty",
City = "Empty",
PostalCode = "Empty",
Province = Guid.Empty,
Phone = "Empty",
Email = "Empty"
});
return PartialView(newRecord);
}
}
以下是视图的布局方式:-
@模型串
@{
Layout=“~/Views/Shared/_LayoutAnonymous.cshtml”;
AjaxOptions=新的AjaxOptions
{
UpdateTargetId=“uploadList”,
InsertionMode=InsertionMode.Replace,
HttpMethod=“POST”
};
}
<div>
@using (Ajax.BeginForm("_UploadBulkClients", "Client",options, new { enctype = "multipart/form-data" , role = "form", @class = Css.Form, @id = "formLogin" , action = "/Client/_UploadBulkClients" }))
{
<div class="@Css.FormGroup">
<h1>Client Bulk Upload</h1>
<div class="@Css.InputGroup">
<label>Upload CSV File</label>
<input type="file" name="postedFile" />
</div>
<div class="@Css.InputGroup">
@Html.Submit("Submit")
</div>
</div>
}
</div>
<div>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Reference No</th>
<th>FirstName</th>
<th>MiddleName</th>
<th>LastName</th>
<th>Phone</th>
<th>Email</th>
<th>StreetAddress</th>
<th>City</th>
<th>PostalCode</th>
<th>Province</th>
</tr>
</thead>
<tbody id="uploadList">
@Html.Action("_UploadBulkClients","")
</tbody>
</table>
</div>
@使用(Ajax.BeginForm(“\u UploadBulkClients”,“Client”,options,new{enctype=“multipart/form data”,role=“form”,“class=Css.form,@id=“formLogin”,action=“/Client/\u UploadBulkClients”}))
{
客户端批量上传
上传CSV文件
@Html.Submit(“提交”)
}
参考号
名字
中间名
姓氏
电话
电子邮件
街道地址
城市
后酒精
省
@Action(“\u uploadBulkClient”,”)
当HttpPost decorator留在PartialView方法的顶部时,它在视图@Html.Action(“\u UploadBulkClients”,”)
中给出一个错误,表示\u UploadBulkClients
操作方法不存在
编辑:-
似乎上传没有发布csv文件,我不理解为什么会这样,因为Ajax表单似乎就是它应该的样子
任何帮助都将不胜感激 在Stephen的帮助下,我找到了答案,必须使用JavaScript,而不是C#中的AjaxOption 以下是一些步骤,以防有人遇到类似情况:- 1.返回表单的控制器方法
public ActionResult UploadBulkClients()
{
return View();
}
二,。表单必须是简单表单,而不是Ajax表单。我在这里使用了Html助手:
@using (Html.BeginForm("_UploadBulkClients", "Client",null, FormMethod.Post , new { enctype = "multipart/form-data" , role = "form", @class = Css.Form, @id = "uploadForm" }))
{
<div class="@Css.FormGroup">
<h1>Client Bulk Upload</h1>
<div class="@Css.InputGroup">
@Html.LabelFor(m=>m.File)
@Html.TextBoxFor(m=>m.File, new { type= "file"})
</div>
<div class="@Css.InputGroup">
@Html.Submit("Submit")
</div>
</div>
}
四,。下一部分是局部视图,它呈现控制器方法的输出
@model List<WebPlatform.ViewModels.ClientAgencyViewModel>
@foreach (var item in Model)
{
<tr>
<td>@item.ReferenceNo</td>
<td>@item.FirstName</td>
<td>@item.MiddleName</td>
<td>@item.LastName</td>
<td>@item.Phone</td>
<td>@item.Email</td>
<td>@item.StreetAddress</td>
<td>@item.City</td>
<td>@item.PostalCode</td>
<td>@item.ProvinceText</td>
</tr>
}
不能使用
Ajax.BeginForm()
上载文件。使用FormData
-参考@StephenMuecke我有点困惑,我不知道如何使用FormData,您所说的是什么意思您可以使用var FormData=new FormData($('form').get(0))将模型序列化为FormData
只需使用我给你的链接中的代码:)但你的文件输入名为postedFile
,这意味着你的POST方法中的参数需要匹配-即HttpPostedFileBase postedFile
如果我懂javascript,我不会问,我需要你向我解释如何使用FormData,或者给我一个链接,因为我还不熟悉ASP.NETMVC,还在学习。JavaScript仍然是我需要坐下来学习的东西,如何使用它!
@model List<WebPlatform.ViewModels.ClientAgencyViewModel>
@foreach (var item in Model)
{
<tr>
<td>@item.ReferenceNo</td>
<td>@item.FirstName</td>
<td>@item.MiddleName</td>
<td>@item.LastName</td>
<td>@item.Phone</td>
<td>@item.Email</td>
<td>@item.StreetAddress</td>
<td>@item.City</td>
<td>@item.PostalCode</td>
<td>@item.ProvinceText</td>
</tr>
}
$('#uploadForm').submit(function(e) {
e.preventDefault();
var formdata = new FormData($(this).get(0));
$.ajax({
url: '@Url.Action("_UploadBulkClients","Client")',
type: 'POST',
data: formdata,
processData: false,
contentType: false,
success: function (response) {
$('#uploadList').html(response);
}
},
);
});