Asp.net mvc 3 尝试使用编辑器模板更新/创建导航属性

Asp.net mvc 3 尝试使用编辑器模板更新/创建导航属性,asp.net-mvc-3,c#-4.0,Asp.net Mvc 3,C# 4.0,我必须说,我是MVC的新手,上次我写C代码是。。。大约4年前:) 这是一个场景: “商店” 肖皮德 名字 (其他资料) 城市ID “城市” 城市ID 名字 (其他资料) “Shop”表具有“City”导航属性 我在MVC3项目中创建了一个“城市”编辑器模板。 此模板使用jQuery查找并用CityID填充隐藏字段 我的店铺表单(与编辑和创建操作共享)使用Html.EditorFor(model=>model.City)作为城市导航属性,而不是使用CityID列 底线是id不起作用,因为控

我必须说,我是MVC的新手,上次我写C代码是。。。大约4年前:)

这是一个场景:

“商店”

  • 肖皮德
  • 名字
  • (其他资料)
  • 城市ID
“城市”

  • 城市ID
  • 名字
  • (其他资料)
“Shop”表具有“City”导航属性

我在MVC3项目中创建了一个“城市”编辑器模板。 此模板使用jQuery查找并用CityID填充隐藏字段

我的店铺表单(与编辑和创建操作共享)使用Html.EditorFor(model=>model.City)作为城市导航属性,而不是使用CityID列

底线是id不起作用,因为控制器试图更新一个不完整的城市对象:

无法将值NULL插入到 列“名称”,表 'C:\USERS\ANDREA\DOCUMENTS\VISUAL 演播室 2010\PROJECTS\inconegna\inconegna\APP_DATA\inconegna.MDF.dbo.Cities'; 列不允许空值。插入 失败。声明已被修改 终止

公平地说,我并没有返回一个完整的“City”对象,但实际上,我需要的只是CityID元素:其余的元素没有用,或者必须由编辑器模板检索(据我所知,这是无法完成的)

老实说,我更愿意只为Shops表(或具有相同列的其他表)的CityID列使用和编辑器模板。 这意味着我必须为泛型“int”类型创建一个编辑器模板,并且我必须明确声明调用Html.EditorFor()时要使用哪个编辑器模板:我宁愿让MVC发现,对于CityID列(int类型),一个名为“City”甚至“CityID”的自定义编辑器模板必须使用:这就是为什么我尝试使用导航属性的“城市”类型


有什么建议吗?

在五个月的时间里,我意识到我的问题有多傻,但当时我没有足够的知识来理解如何正确使用Entity Framework和MVC

我想我可以回答我自己的问题,说我不应该为导航属性创建编辑器模板,因为我可以自由地使用与外键相关的实体属性,如果我需要向ViewModel(或ViewData)添加显示下拉列表所需的所有数据(见下文)

在这种情况下,外键将是CityID。当我调用Html.EditorFor()时,我可以在那里指定我必须使用的模板(例如“CitySelector”或任何我想要的模板)(也许我甚至可以在ViewModel中使用数据注释:我不知道这一点)

EditorTemplate将是EditorTemplates文件夹中名为“CitySelector”的局部视图:在那里我可以显示一个下拉列表,或者更好的是,显示一个自动完成文本框(jQuery)。 jQuery解决方案是显示城市列表的最佳方法,而无需在ViewModel/ViewData中加载所有城市


希望正确地回答我自己的问题:)

我忘了提到我的编辑器模板实际上需要一个“City”对象,因为它必须显示“Name”属性/列,而我在Shop对象中已经有了“CityID”值。例如,ShopID=1是一个现有记录,其CityID=2与城市“罗马”匹配。编辑现有店铺记录时,编辑器模板必须显示“罗马”。