我正在寻找是否有办法消除我的方法对谷歌地图进行计算长/纬度坐标的两次调用之一。
这是我的方法。
public static GeocoderCoordinates GetCoordinates(string region)
{
WebRequest request = WebRequest.Create("http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address=" + HttpUtility.UrlEncode(region));
using (WebResponse response = request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
XDocument document = XDocument.Load(new StreamReader(stream));
XElement longitudeElement = document.Descendants("lng").FirstOrDefault();
XElement latitudeElement = document.Descendants("lat").FirstOrDefault();
if (longitudeElement != null && latitudeElement != null)
{
return new GeocoderCoordinates
{
Longitude = Double.Parse(longitudeElement.Value, CultureInfo.InvariantCulture),
Latitude = Double.Parse(latitudeElement.Value, CultureInfo.InvariantCulture)
};
}
}
}
return null;
}
我第一次称这种方法用于验证。
internal class ValidateLocationAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var location = value as string;
GeocoderCoordinates coordinates = Geocoding.GetCoordinates(location);
if (coordinates == null)
return false;
return true;
}
}
如果没有找到位置,则返回null - 验证失败。 它第二次被调用是在控制器中设置我的实体内的经度/纬度坐标。
[HttpPost]
public ActionResult Edit(EditStudentViewModel viewModel)
{
if (ModelState.IsValid)
{
Student student = studentRepository.Find(User.Identity.GetUserId());
if (student == null)
{
var newStudent = new Student
{
AspNetUserRefId = viewModel.AspNetUserRefId,
CatchPhrase = viewModel.CatchPhrase,
StartedPracticing = Convert.ToInt16(viewModel.SelectedYearId),
LocationPoints = Geocoding.GetDbGeography(viewModel.Location),
Location = viewModel.Location,
我只是为了插入/更新学生而两次运行此方法。这似乎有点多余。
当控制器中的代码运行时,是否有触发/设置验证状态的方法,因此我不必调用此方法两次(一次用于验证,一次用于设置实际值) )当用户提交表单时?
我考虑过缓存,但不要认为这是一个好主意,除非有人可以指出一些事情。
答案 0 :(得分:0)
如果您认为使用文本框中的属性预先应用验证会为用户提供值(早期反馈),请保持原样。考虑到解决方案的价值和清洁度,两次通话都不算太糟糕。
第二个选项是您可以删除该属性,并在控制器操作中执行验证。如果验证失败,则显示具有所有相同数据的相同表单,但显示文本框值(位置)的错误消息。用户需要选择其他位置然后提交。
这是一种权衡。
重要提示:您可以通过在数据库中存储区域名称来优化解决方案,只有在数据库中没有区域名称时才能使用Google API。