试图消除验证和实体的冗余代码执行

时间:2015-02-23 05:37:12

标签: c# asp.net-mvc redundancy asp.net-validators

我正在寻找是否有办法消除我的方法对谷歌地图进行计算长/纬度坐标的两次调用之一。

这是我的方法。

    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,

我只是为了插入/更新学生而两次运行此方法。这似乎有点多余。

当控制器中的代码运行时,是否有触发/设置验证状态的方法,因此我不必调用此方法两次(一次用于验证,一次用于设置实际值) )当用户提交表单时?

我考虑过缓存,但不要认为这是一个好主意,除非有人可以指出一些事情。

1 个答案:

答案 0 :(得分:0)

如果您认为使用文本框中的属性预先应用验证会为用户提供值(早期反馈),请保持原样。考虑到解决方案的价值和清洁度,两次通话都不算太糟糕。

第二个选项是您可以删除该属性,并在控制器操作中执行验证。如果验证失败,则显示具有所有相同数据的相同表单,但显示文本框值(位置)的错误消息。用户需要选择其他位置然后提交。

这是一种权衡。

重要提示:您可以通过在数据库中存储区域名称来优化解决方案,只有在数据库中没有区域名称时才能使用Google API。