我必须说我对MVC很新,上次我写了C#代码是...大约4年前:)
这是情景:
“商店”
“城市”
“购物”表有“城市”导航属性
我在MVC 3项目中创建了一个“City”编辑器模板。 此模板使用jQuery查找并使用CityID填充隐藏字段。
我的商店表单(与编辑和创建操作共享)使用Html.EditorFor(model => model.City)作为城市导航属性,而不是使用CityID列。
好吧,底线是id不起作用,因为控制器正在尝试更新不完整的City对象:
无法将值NULL插入 列'名称',表格 “C:\用户\ ANDREA \文档\ Visual 工作室 2010 \ PROJECTS \ INCONSEGNA \ INCONSEGNA \ APP_DATA \ INCONSEGNA.MDF.dbo.Cities'; 列不允许空值。插入 失败。声明一直如此 终止。
很公道,我没有返回一个完整的“城市”对象,但实际上,我需要的只是CityID元素:其余部分是无用的,或者必须由编辑器模板检索(就其本身而言)我可以看到,无法做到。)
老实说,我更喜欢使用和编辑模板仅用于Shops表的CityID列(或具有相同列的其他表)。 这意味着我必须为泛型“int”类型创建一个编辑器模板,并且我必须在调用Html.EditorFor()时显式声明我想要使用哪个编辑器模板:我宁愿让MVC找出来对于CityID列(类型为int),必须使用名为“City”或甚至“CityID”的自定义编辑器模板:这就是我尝试使用导航属性的“City”类型的原因。
有什么建议吗?
答案 0 :(得分:0)
在五个月内,我意识到我的问题有多愚蠢,但当时我没有足够的知识来理解如何正确使用Entity Framework和MVC。
我想我可以回答我自己的问题,说我不应该为导航属性创建编辑器模板,当我可以自由地使用与外键相关的实体属性时,如果我需要添加到ViewModel (或ViewData)显示下拉列表所需的所有数据(见后期)。
在这种情况下,外键将是CityID。当我调用Html.EditorFor()时,我可以指定哪个模板(例如“CitySelector”,或者我想要的任何东西)我必须使用(也许我甚至可以在ViewModel中使用数据注释:我不知道这一点)。
EditorTemplate将是一个名为“CitySelector”的局部视图,位于EditorTemplates文件夹中:在那里我可以显示一个下拉列表,或者更好的是,显示一个自动完成文本框(jQuery)。 jQuery解决方案是显示城市列表的最佳方法,无需在ViewModel / ViewData中加载所有城市。
希望能够正确回答我自己的问题:)