我正在使用MVC 5 / Razor 3,Bootstrap 3.x开发ASP.NET 4.0(.NET 4.5)Web应用程序。在这个特定的控制器中,我使用了Google Maps API v3。
基本上在其他许多东西中我有两个文本框,一个用于Latitude,另一个用于Longitude。然后我还有一个带有一个标记的谷歌地图。
当用户右键点击某个位置时,我希望为标记设置当前单击“Lat / Long”并更新“Lat / Long”文本框并将地图居中放置。
当用户将标记拖动到新位置时,应该发生同样的事情,两个文本框都会使用新的标记位置进行更新。
除了添加Google地图之外,表单的其余部分与Visual Studio完全相同"使用EF CRUD添加视图"模板。
现在问题了... VS模板创建的文本框控件代码不允许您设置一个控件ID,我可以使用jQuery / Javascript代码来更新文本框但是所有的地图行为(标记替换,居中)等)工作:
@Html.EditorFor(model => model.longitude, new { htmlAttributes = new { @class = "form-control" } })
在这个网站的某个地方有人建议另一个人使用TextBoxFor而不是EditorFor,它似乎可以让你指定文本框的ID。但是,这会以标准形式呈现两个文本框,这与其他文本框的外观完全不一致。
所以我接着选择了另一个替换代码的建议:
@Html.EditorFor(model => model.latitude, null, "mylatitude", new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.latitude, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.latitude, null, "mylongitude", new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.longitude, "", new { @class = "text-danger" })
使用此表单时,文本框与其他文本框类似,当我移动标记或右键单击纬度/经度文本框时,会使用相应的坐标进行更新,因为我可以使用我在编辑器中声明的ID从JavaScript中解决它们。
但是,当我提交表单时,文本框上的纬度/经度值都不会填充到模型上,其他模型值也会正确填充。如果我恢复原来的EditorFor -where,我无法指定ID-那么值就会正确提交。
因此,文本框得到更新(正确的ID)会有一些奇怪的东西,但不知何故,通过Javascript填充的实际文本框值不会填充到模型中。
答案 0 :(得分:0)
使用重载时
@Html.EditorFor(model => model.latitude, null, "mylatitude", ..
第3个参数是将name属性设置为mylatitude
,该属性与属性名称latitude
不匹配,因此DefaultModelBinder
无法匹配值。
为什么不能使用生成的@Html.EditorFor(model => model.longitude, ..
ID为“经度”,或者使用TextBoxFor
并添加相关的类名,以使其样式与生成的输出相同按@Html.EditorFor