列出带有敲除的HttpPostedFileBase

时间:2013-06-10 12:39:21

标签: asp.net-mvc-3 knockout.js

我有一个带表单的创建视图。它有一个输入文本(环境),输入文件(徽标)下拉列表(平台)和视图模型列表(天)。

这工作正常。现在我想添加一个“动态字段”来插入文件。典型的添加文件,删除文件。我看到这是用淘汰赛完成的。我的问题是如何处理HttpPostedFileBase和敲除,最糟糕的是,一个HttpPostedFileBase和淘汰列表。

我已经这样做了,但它不起作用。任何帮助都将非常感激。

CreateView的:

@model HPRWT.ViewModels.ReportViewModel

<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout-2.1.0.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout.namepathbinding.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/Files.js")" type="text/javascript"></script>

@using (Html.BeginForm("Create", "Service", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Report</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Enviroment)

            @Html.EditorFor(model => model.Enviroment, new { data_bind = "value: enviroment" })
            @Html.ValidationMessageFor(model => model.Enviroment)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Logo)
            @Html.TextBoxFor(model => model.Logo, new { type = "file", data_bind = "value: logo" })
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.PlatformID)
            @Html.DropDownListFor(model => model.PlatformID, Model.Platforms.Select(f => new SelectListItem { Text = f.name, Value = f.ID.ToString() })) 
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.InputFiles)
            @for (int j = 0; j < Model.InputFiles.Count; j++)
            {
                @Html.TextBoxFor(model => model.InputFiles[j], new { type = "file", data_bind = "value: inputFile"  })
            }
            <button data-bind="click: addFile">Add Log</button>
            <button data-bind="click: removeFile">Remove Log</button>
        </div>

        <table id="hours">
            @for (int i = 0; i < 7; i++)
            {
                <tr>
                    <td>@Model.Days[i].Label</td>
                    @for (int j = 0; j < 24; j++)
                    {
                        <td><div>@Html.CheckBoxFor(model => model.Days[i].Hours[j].Selected)@Html.LabelFor(model => model.Days[i].Hours[j].Selected, @" ")</div></td>
                    }
                </tr>
            }
        </table>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Files.js

function createViewModel() {

    var createFile = function () {
        return {
            inputFile: ko.observable()
        };
    };

    var addFile = function () {
        inputFiles.push(createFile());
    };

    var removeFile = function () {
        inputFiles.pop();
    };

    var enviroment = ko.observable();
    var logo = ko.observable();
    var inputFiles = ko.observableArray();

    return {
        enviroment: enviroment,
        logo: logo,
        inputFiles: inputFiles,
        addFile: addFile,
        removeFile: removeFile
    };

}

$(document).ready(function () {
    var viewModel = createViewModel();
    ko.applyBindings(viewModel);
});

ReportViewModel:

public class ReportViewModel
    {

        public int ID { get; set; }
        public IEnumerable<Platform> Platforms { get; set; }
        public int PlatformID { get; set; }
        public string Enviroment { get; set; }
        public HttpPostedFileBase Logo { get; set; }
        public IList<HttpPostedFileBase> InputFiles { get; set; }
        public IList<DayViewModel> Days { get; set; }


        public ReportViewModel()
        {
            Days = Enumerable.Range(1, 7).Select(day => new DayViewModel { Value = day }).ToList();
            InputFiles = new List<HttpPostedFileBase>();
        }

    }

DayViewModel:

public class DayViewModel
    {

        public int Value { get; set; }    
        public virtual IList<HourViewModel> Hours { get; set; }

        public DayViewModel()
        {
            Hours = Enumerable.Range(0, 24).Select(hour => new HourViewModel { Value = hour }).ToList();
        }

    }

HourViewModel:

public class HourViewModel
{
    public int Value { get; set; }
    public bool Selected { get; set; }
}

1 个答案:

答案 0 :(得分:0)

尝试使用 InputFiles 数组而不是IList

我不确定IList但是当你将属性作为List时,你必须将html字段 name 保持为fieldlist.propname。 index (和 Id 将是fieldlist_propname_ index ),其中索引将从0开始为默认或第一个字段,当您添加新控件时,其名称应该像fieldlist.propname一样增加。 0 (第一个)然后是fieldlist.propname。 1 等等...... 然后只有模型绑定器才能绑定。

如果有效,可以尝试使用Array,然后我认为你很高兴