在我的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更新。我检查了model
和collection
并且它们具有正确的值,但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
...
}
这样可行,但是我确信我不应该这样做,并希望那里的人可以解释我在忽视的内容!
答案 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();
})