MVC UpdateModel未更新某些模型属性

时间:2014-11-27 13:04:19

标签: c# asp.net-mvc entity-framework updatemodel

在我的MVC 5 EF Database First项目中,我一直在我的控制器动作中成功使用UpdateModel方法,但是在包含一些额外的字段(之前未被应用程序使用)之后,我发现新字段只是拒绝从UpdateModel方法获取值呼叫。我可以确定的唯一有意义的是,这些字段共享其名称的一部分。

以此类为例:

public class Record
{
public int ID {get;set;}
public string Details {get;set;}
public string DetailsFile {get;set;}
...
}

属性/字段DetailsFile以前未使用过,但现在是网络表单上的可选字段。它存储在<input type="hidden" name="DetailsFile" id="DetailsFile />中,并使用正确的值(或空字符串)成功发布到控制器操作。

在控制器操作中,我处理这样的更新:

[HttpPost]
public async Task<ActionResult> Edit(Record_EditView model, FormCollection collection)
{
    if (ModelState.IsValid)
    {
        try
        {
            var record = await db.Record.FindAsync(model.ID);
            UpdateModel(record, collection);
            db.Entry(record).State = EntityState.Modified;
            await db.SaveChangesAsync();
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    // do more stuff here
    ...
}

哪个一直运行良好,但附加字段以外的所有字段DetailsFile从传入的FormCollection更新。我检查了modelcollection并且它们具有正确的值,但record永远不会获得值,直到我对相同数据发表第二篇文章。然后按预期将值推入字段。

我没有抛出任何错误,并且对于发生的事情感到有些不知所措。暂时我已经将控制器操作修改为:

[HttpPost]
public async Task<ActionResult> Edit(Record_EditView model, FormCollection collection)
{
    if (ModelState.IsValid)
    {
        try
        {
            var record = await db.Record.FindAsync(model.ID);
            UpdateModel(record, collection);
            record.DetailsFile = collection["DetailsFile"]; // <-- Manually insert DetailsFile value
            db.Entry(record).State = EntityState.Modified;
            await db.SaveChangesAsync();
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    // do more stuff here
    ...
}

这样可行,但是我确信我不应该这样做,并希望那里的人可以解释我在忽视的内容!

1 个答案:

答案 0 :(得分:1)

终于找到了问题,它不太可能让很多人受益,但以防万一这里是答案。

更多信息

在我的项目中,我开始使用jquery插件以更自助的方式设置文件输入元素,即Jasny Bootstrap

该插件效果很好,但作为其内部工作的一部分,它需要采取措施来维护现有数据的状态,并通过使用隐藏输入和重命名文件输入来避免冲突后出现:

this.$hidden.val('')
this.$hidden.attr('name', '')
this.$input.attr('name', this.name)

问题

最终会出现具有属性name=""且导致页面发布元素的元素,而FormCollection包含空的&#34;&#34;项目(S)。

尽管没有抛出任何错误,但它似乎打破了对

的呼吁
UpdateModel(record,collection)

解决方案

要解决此问题并避免发布所选文件(我的项目实际上并不想要发布文件,只是文件路径)我只是拦截表单提交以在发布之前删除不需要的表单元素:< / p>

$('form').submit(function (e) {
    e.preventDefault();
    // get rid of any input elements that have name="" or file elemnts so will not mess with the posted form collection
    $('input[name=""],input[type="file"]').remove();
    this.submit();
})