尝试使用编辑器模板更新/创建导航属性

时间:2011-04-23 11:18:14

标签: asp.net-mvc-3 c#-4.0

我必须说我对MVC很新,上次我写了C#代码是...大约4年前:)

这是情景:

“商店”

  • ShopID
  • 名称
  • (其他东西)
  • CityID

“城市”

  • CityID
  • 名称
  • (其他东西)

“购物”表有“城市”导航属性

我在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”类型的原因。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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