Попытка устранить избыточное выполнение кода для проверки и сущности
Я смотрю, есть ли способ исключить один из двух вызовов моего метода к картам 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;
}
}
и если нет найденного местоположения, он возвращает нуль - проверка не пройдена. Второй раз, когда он вызывается, в контроллере устанавливаются координаты долготы / широты в моей сущности.
[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,
Так что я бегу через этот метод дважды, чтобы вставить / обновить студента. Кажется, немного излишним.
Нет ли способа вызвать / установить состояние проверки во время выполнения кода в контроллере, поэтому мне не нужно вызывать этот метод дважды (один раз для проверки и один раз для установки фактических значений), когда пользователь отправляет форму?
Я думал о кешировании, но не думаю, что это хорошая идея, если кто-то не может указать на что-то.
1 ответ
Если вы считаете, что применение проверки заранее с использованием атрибута в текстовом поле служит для пользователя полезным (ранняя обратная связь), оставьте все как есть. Два звонка совсем не плохо, учитывая ценность и чистоту решения.
Второй вариант - вы можете удалить атрибут и выполнить проверку в действии контроллера. Если проверка не удалась, отобразите ту же форму со всеми теми же данными, но с сообщением об ошибке для значения текстового поля (местоположение). Пользователь должен будет выбрать другое местоположение и затем отправить.
Это компромисс.
Важный совет: вы можете оптимизировать свое решение, сохраняя названия регионов в вашей БД и переходя на Google API, только если имя региона не присутствует в вашей БД.