我期待看看是否有一種方法可以消除兩個調用中的一個,這些調用是通過Google地圖來計算長/緯度座標的。試圖消除驗證和實體冗餘代碼執行
這是我的方法。
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,
所以我正在運行這個方法兩次只是爲了插入/更新一個學生。這似乎有點多餘。
是不是有在控制器中的代碼運行時,觸發/套的驗證狀態的方式,所以我不必兩次調用此方法(一次驗證和一次設置的實際值)時,用戶提交表單?
我想過緩存但不認爲這是一個好主意,除非有人能指出一些東西。
我沒有找到另一個電話給GetCoordinates。 – SBirthare 2015-02-23 06:29:34
你在哪裏應用ValidateLocationAttribute? – SBirthare 2015-02-23 06:31:36
我將它應用於視圖中顯示的視圖模型memeber。這是一個文本框...所以用戶進入一個位置前。舊金山,驗證方法運行。然後,如果所有驗證都通過了控制器操作方法,並且它再次調用地理位置方法來獲取位置並在提交到數據庫之前設置長/緯度值 – user1186050 2015-02-23 07:20:31