带有用于jQuery的文本框ID的Html.EditorFor

时间:2014-09-18 21:08:46

标签: javascript google-maps google-maps-api-3 asp.net-mvc-5 editorfor

我正在使用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填充的实际文本框值不会填充到模型中。

1 个答案:

答案 0 :(得分:0)

使用重载时

@Html.EditorFor(model => model.latitude, null, "mylatitude", ..

第3个参数是将name属性设置为mylatitude,该属性与属性名称latitude不匹配,因此DefaultModelBinder无法匹配值。

为什么不能使用生成的@Html.EditorFor(model => model.longitude, .. ID为“经度”,或者使用TextBoxFor并添加相关的类名,以使其样式与生成的输出相同按@Html.EditorFor