Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时/何地/如何在MVC中填充模型的属性_C#_Asp.net Mvc 3_Google Maps_Design Patterns_Json.net - Fatal编程技术网

C# 何时/何地/如何在MVC中填充模型的属性

C# 何时/何地/如何在MVC中填充模型的属性,c#,asp.net-mvc-3,google-maps,design-patterns,json.net,C#,Asp.net Mvc 3,Google Maps,Design Patterns,Json.net,我有一个包含地址属性和纬度/经度属性的模型。该模型填充在“创建”视图中,在该视图中,它们放置在大多数其他字段中。我根据输入的地址使用Google Maps API地理编码功能填充Lat/Lng(让他们手动输入没有意义) 我的大问题是这应该在哪里进行。下面的代码可以工作,但我认为它相当笨拙。有没有更好的方法来整合这种行为的想法?它应该在控制器中吗?它应该是某种内部模型机制的一部分吗 [HttpPost] public ActionResult Create(Church church) {

我有一个包含
地址
属性和
纬度
/
经度
属性的模型。该模型填充在“创建”视图中,在该视图中,它们放置在大多数其他字段中。我根据输入的地址使用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);
}
[HttpPost]
公共行动结果创建(教堂)
{
尝试
{
if(ModelState.IsValid)
{
string address=string.Format(“{0},{1},{2}{3}”,
church.Street+church.Street2,church.City,
教堂、地区、教堂、邮政编码);
JObject jsonResult=GoogleApiHelper.GetAddressGeocodeData(地址);
//在这里处理一些错误状态。。。
if(jsonResult[“results”].Count()==1)
{
church.Latitude=jsonResult.SelectToken(
“结果[0].geometry.location.lat”).Value();
church.Longitude=jsonResult.SelectToken(
“结果[0].geometry.location.lng”).Value();
unitOfWork.ChurchRepository.Insert(church);
unitOfWork.Save();
返回操作(“索引”);
}              
}
}
捕获(数据异常)
{
//记录错误(在DataException之后添加变量名)
AddModelError(“,“无法保存更改”);
}
返回视图(教堂);
}

您可以使用存储库层来抽象对Google API的访问,然后从控制器调用此存储库,为您提供一个已填充的模型。这样,如果明天您决定使用Bing而不是Google,那么您所要做的就是更改存储库的实现。无需触摸控制器或模型逻辑。

您可以编写自定义模型绑定器,并将所有Google API代码放在其中。这样,您的控制器将完全忘记您的数据访问

以下是有关自定义模型绑定器的教程:


主要的问题是你打算在其他地方建立教堂吗

如果不是,那么这是一个完全可以接受的放置代码的地方


如果需要,则将代码放入一个可以从两个位置调用的服务中。这样,您就可以保持干燥(不要重复)原则,而不会使代码过于复杂。

谢谢。这是在我的数据库中创建模型的过程,而不是在退出的过程中。你介意详细说明一下这个过程吗?google maps repository方法会返回
Church
对象吗?或者签名需要
Church
输出参数吗?它会接受Church参数并执行实际保存。啊,我误解了你的意思。我以为你的意思是创建一个单独的“谷歌地图库”。您的意思是,修改我现有的存储库(如果可以导航到我的UnitOfWork,您会看到它)插入方法,对吗?