以单一形式上传多个文件asp.net mvc4

时间:2013-12-12 04:32:50

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-2

我正在尝试以一种形式上传多个文件,我尝试了不同的方法。

这是我的模特

[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)  

包含已发布的文件吗?

0 个答案:

没有答案