我的模型包含Address
属性和Latitude
/ Longitude
属性。该模型填充在“创建”视图中,放置在大多数其他字段中。我根据输入的地址使用Google Maps API地理编码功能填充Lat / Lng(没有意义将它们手动放入)。
我的大问题是应该在哪里完成。下面的代码有效,但我觉得它非常笨重。有关更好地整合这种行为的想法吗?它应该在控制器中吗?它应该是某些内部模型机制的一部分吗?
[HttpPost]
public ActionResult Create(Church church)
{
try
{
if (ModelState.IsValid)
{
string address = string.Format("{0},{1},{2} {3}",
church.Street + church.Street2, church.City,
church.Region, church.PostalCode);
JObject jsonResult = GoogleApiHelper.GetAddressGeocodeData(address);
//Handle some error states here...
if (jsonResult["results"].Count() == 1)
{
church.Latitude = jsonResult.SelectToken(
"results[0].geometry.location.lat").Value<double>();
church.Longitude = jsonResult.SelectToken(
"results[0].geometry.location.lng").Value<double>();
unitOfWork.ChurchRepository.Insert(church);
unitOfWork.Save();
return RedirectToAction("Index");
}
}
}
catch (DataException)
{
//Log the error (add a variable name after DataException)
ModelState.AddModelError("", "Unable to save changes.");
}
return View(church);
}
答案 0 :(得分:2)
您可以使用存储库层来抽象对Google API的访问,然后从控制器调用此存储库以为您提供已填充的模型。这样,如果明天您决定使用Bing而不是Google,则必须更改的是存储库的实现。无需触摸控制器或模型逻辑。
答案 1 :(得分:0)
您可以编写自定义模型绑定器并将所有Google API代码放在那里。这样,您的控制器将完全忘记您的数据访问。
以下是自定义模型绑定器的教程:
http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/
答案 2 :(得分:0)
主要问题是你要在其他地方创建教堂吗?
如果没有,那么这是放置代码的完全可以接受的地方。
如果您将代码放入可以从两个地方调用的ChurchService中。这样你就可以保持干燥(不要重复自己)原则而不会使你的代码过于复杂。