我正在尝试以一种形式上传多个文件,我尝试了不同的方法。
这是我的模特
[MetadataType(typeof(MovieMetadata))]
public partial class Movie
{
}
class MovieMetadata
{
[ScaffoldColumn(false)]
public int id { get; set; }
[Required(ErrorMessage = "Title is required")]
public string title { get; set; }
[Required]
public DateTime releaseDate { get; set; }
public string storyline { get; set; }
public Binary poster { get; set; }
[ScaffoldColumn(false)]
public DateTime? duration { get; set; }
[ScaffoldColumn(false)]
public Binary trailer { get; set; }
}
我要上传的其中一个文件是视频,所以我把这个标签放在我的Web.config中上传一个小于1 GB的文件,我放了一个大号,因为我不知道视频的大小
<httpRuntime targetFramework="4.5" maxRequestLength="102400"/>
我的控制器如下:
[HttpPost]
public ActionResult Create(Movie movie)
{
if (ModelState.IsValid)
{
//saving the movie
OperationStatus opStatus = Repository.Save(movie);
if (!opStatus.Status)
{
return View("Error");
}
}
return View(movie);
}
这是我的观点:
@model MoviesModel.Movie
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/MoviesLayout.cshtml";
}
@section createMovie{
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "createForm", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="gallMemberBox">
<div class="leftFormContent">
<a href="#">Movie Name</a>
<div class="imgTmpl">
<!--solo hay que especificar el src de la imagen-->
<img src="../../Content/img/imgTest.jpg" alt="" />
</div>
</div>
<div class="rightFormContent">
<div>
@Html.LabelFor(model => model.title)
@Html.EditorFor(model => model.title)
@Html.ValidationMessageFor(model => model.title)
</div>
<div>
@Html.LabelFor(model => model.releaseDate)
@Html.EditorFor(model => model.releaseDate)
@Html.ValidationMessageFor(model => model.releaseDate)
</div>
<div>
@Html.LabelFor(model => model.duration)
<div>
<input type="text" id="time1" size="10" />
</div>
<pre><code></code></pre>
</div>
<div>
@Html.Label("Poster")
<input name="poster" value="C:" id="poster" type="file" />
</div>
<div>
@Html.Label("Trailer")
<input name="trailer" value="" id="trailer" type="file" />
</div>
<div>
@Html.LabelFor(model => model.storyline)
<textarea id="storyline"></textarea>
</div>
<input type="submit" value="Create" />
</div>
<div class="clearBoth"></div>
</div>
}
}
@section scripts{
@Scripts.Render("~/Scripts/jquery.timePicker.js")
<script type="text/javascript">
jQuery(function ()
{
// Default.
$("#time1").timePicker(
{
startTime: "00.00",
endTime: new Date(0, 0, 0, 6, 30, 0),
show24Hours: true,
separator: ':',
step: 3
}
);
})
</script>
}
@section styles{
@Styles.Render("~/Content/timePicker.css")
}
这包括timepicker.js和css(在节样式内)。开始时间是显示第一个选择时间选项,小时00:00和结束时间是06:30,show24hours选项隐藏在控制上午和下午格式,步骤3表示控件将有所有小时使用之前的格式与.3分钟的差异。顺序是这样的:00:00 00:03 00:06 ...... 06:27 06:30我是从这个网站https://github.com/perifer/timePicker/blob/master/index.htm
获取的问题如下,当我尝试提交包含所有数据的表单时(包括不需要的字段,首先我收到此消息:
输入不是有效的Base-64字符串,因为它包含非基数64 字符,两个以上的填充字符或非法字符 在填充字符中。
我用这段代码解决了这个问题:
public ActionResult Create([Bind(Exclude = "poster, trailer")]Movie movie, HttpPostedFileBase poster, HttpPostedFileBase trailer)
所以我排除了海报和预告片字段,我将它们传递给控制器,如HttpPostedFileBase,这可行,但我的ModelState.IsValid为false。我认为这可能是我的时间选择器的问题,所以我从视图中排除了持续时间字段,然后我再次尝试,而且我又错了。我试着用这个:
public ActionResult Create(FormCollection formCollection)
并且帖子刚刚出现了两个键,title和releaseDate。其他人怎么样?具有false值的ModelState.IsValid怎么样?我可以使用强类型解决我的问题,而不使用我在控制器的Create方法中放置的HttpPostedFileBase额外参数吗?(像这样:)
public ActionResult Create(Movie movie)
包含已发布的文件吗?