【发布时间】:2017-02-15 14:11:58
【问题描述】:
对于可能的重复,我已经知道如何在上传之前预览我的图像,我的问题如下详述,当我提交表单时,图像被接收为空。
我正在尝试向 MVC 控制器提交一个表单,该控制器应该提交一个模型、一个字符串和一个图像文件,
我确保输入与控制器中的参数具有相同的名称
下面是表单初始化代码
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName,
new
{
calendar = System.Convert.ToString(Request.QueryString["calendar"]),
ID = System.Convert.ToString(Request.QueryString["id"])
},
FormMethod.Post, new { enctype = "multipart/form-data" }))
{
//Model Input
<input style="opacity: 0;" name="EventImage" type="file" accept="image/jpeg, image/jpg" id="ImageUpload" onchange="readURL(this);" />
}
还有控制器头
[HttpPost]
[ValidateInput(false)]
public ActionResult AddEvent(Event model, string calendar, HttpPostedFileBase EventImage)
EventImage 参数返回 null,我似乎无法弄清楚原因。 我认为 ID 可能导致问题,所以我将 name 属性更改为 ImageUpload 以及控制器中的 Parameter 但无济于事,因为该值仍然为 null。
附加信息:当用户上传图片时,我让他们在图片框中预览它,这可能是导致它的原因吗?
谢谢,
更新:
这里是 readURL 函数的代码
function readURL(input) {
if (input.files && input.files[0]) {
var ImageCorrect = false;
var file = input.files[0];
var reader = new FileReader();
reader.onload = function (e) {
// Concatenate our HTML image info
var ext = file.name.match(/\.([^\.]+)$/)[1];
switch (ext) {
case 'jpg':
case 'jpeg':
case 'JPG':
case 'JPEG':
{
if ((Math.round(file.size / 1024)) > 500) {
alert('Image is too Large');
}
else {
var image = new Image();
image.src = e.target.result;
image.onload = function () {
var width = parseInt(image.width);
if (width <= 500) {
$('#previewImage').attr('src', e.target.result);
$('#previewImage').show();
}
else {
alert('Image width exceeds maximum width');
}
}
}
}
break;
default:
alert('Image type not allowed')
}
}
reader.readAsDataURL(input.files[0]);
}
}
【问题讨论】:
-
您的
readURL(this)函数在做什么?如果您只是进行普通提交,那么您显示的代码将正确绑定到您的参数EventImage如果文件输入有name="EventImage"(id属性与发布的值无关,仅与 javascript 相关/css 选择器) -
就是将文件读入img标签,以便创建预览
-
@StephenMuecke 我现在添加了它
-
该代码看起来不错,但为了确定,暂时删除
onchange="readURL(this);并测试文件是否已正确上传和绑定。 -
谢谢@StephenMuecke,我会试一试并发布结果
标签: asp.net-mvc forms sitecore httppostedfilebase