1

我正在尝试创建一个系统,用于使用表单编辑 pdf 文件中的字段。编辑数据后,我想保存一个版本。但是,要求是系统应或多或少与任何使用表格的 pdf 一起使用。我对此的解决方案是我使用 iTextSharp 读取 pdf 中的字段并将其存储在模型内的 Dictionary 中。为了能够将字典存储在数据库中(使用实体框架),我制作了一个序列化程序,将字典与字符串连接/拆分。

现在问题来了:当我保存表单时,我的问题就开始了。数据很好地到达视图,但是从视图中出来并再次进入控制器,没有来自字典创建的字段的数据。我假设问题来自使用字典和动态构建表单,但我很难看到我将如何解决这个问题。

这是代码:

该模型:

    public class Diplom
    {
        public string filnavn { get; set; }
        public int Id { get; set; }

        private Dictionary<string, string> _fields;

        private DateTime datevalue;


        // CTOR:
        public Diplom()
        {
            _fields = new Dictionary<string, string>();
        }

        public DateTime BestaattTid
        {
            get
            {
                return datevalue.Date;
            }
            set
            {
                datevalue = value;
            }
        }

        // Get/set, whole dictionary.
        public Dictionary<string, string> Fields
        {
            get
            {
                return _fields;
            }
            set
            {
                _fields = value;
            }
        }
                ...
                ...
}

控制器中的方法:现在返回的方法基本上被注释掉了,我只是在那里使用一个断点来检查对象返回模型,这表明_field字典是空的。

   //
    // GET: /Diplom/Edit/5

    public ActionResult Edit(int id)
    {
        using (var db = new ProjectContext())
        {
            var d = db.Diplomas.Find(id);
            return View(d);
        }
    }

    //
    // POST: /Diplom/Edit/5

    [HttpPost]
    public ActionResult Edit(int id, Diplom returningmodel)
    {
        try
        {
            //var db = new ProjectContext();
            //db.Entry(returningmodel).State = System.Data.EntityState.Modified;
            //db.SaveChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

最后是视图(Edit.cshtml):

@model txt.Models.Diplom

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Diplom</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.filnavn)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.filnavn)
            @Html.ValidationMessageFor(model => model.filnavn)
        </div>

        @Html.HiddenFor(model => model.Id)

        <div class="editor-label">
            @Html.LabelFor(model => model.BestaattTid)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.BestaattTid)
            @Html.ValidationMessageFor(model => model.BestaattTid)
        </div>

        <h3>Dynamic fields</h3>

        @foreach(var modelfield in Model.Fields )
        {
            <div class="editor-label">
                @Html.Label(modelfield.Key)
            </div>

            <div class="editor-field">
                @Html.EditorFor( m => modelfield.Value )
                @Html.ValidationMessage( modelfield.Value)
            </div>
        }
        <p><input type="submit" value="Save" /></p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

我该如何解决这个问题?

4

1 回答 1

0

默认模型绑定器可能无法将表单中提交的动态字段列表连接到模型中的字典。由于这是一个非常具体的要求,我建议在您的 post 方法中使用 FormCollection 而不是模型绑定器来获取从您的表单提交的所有字段。

[HttpPost]
public ActionResult Edit(int id, FormCollection form)
{
    try
    {
        foreach(var field in form.Keys)
        {
            switch (fieldToUpper().Trim())
            {
                case "FIELDNAME":
                    // assign value to your model property
                    break;
            }
        }

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
于 2012-09-04T08:10:03.960 回答