2011-12-30 89 views
0

在我的MVC3解决方案中,我想知道如何移动将Json从控制器中退出并返回到服务层的逻辑。说我已经得到的Json需要在我的控制器下面的行动以便对jQueryUI的自动完成控制:JsonResult in services layer

public JsonResult ClientAutocompleteJSON(string term) 
{ 
    NorthwindEntities db = new NorthwindEntities(); 
    var customers = db.Customers 
       .Where(c => c.ContactName.Contains(term)) 
       .Take(25) 
       .Select(c => new 
       { 
        id = c.CustomerID, 
        label = c.ContactName, 
        value = c.ContactName 
       }); 

    return Json(customers, JsonRequestBehavior.AllowGet); 
} 

我怎么会移动到这个服务层?我不想在我的服务层中引用System.Web.MVC。我也想过退回客户,但我不知道如何返回匿名类型 - 我是否需要创建一个类?

+1

关于退回客户 - 您不能返回匿名类型,并且确实需要一个类。 – Oded 2011-12-30 08:11:50

回答

2

我不会将您的服务实现耦合到特定的(UI)格式。最好是返回一个强类型的客户对象,然后在Action方法中设置你想要的格式。

// Service method 

public IEnumerable<Customer> FindCustomers(string term) { 
    NorthwindEntities db = new NorthwindEntities(); 
    return db.Customers 
       .Where(c => c.ContactName.Contains(term)) 
       .Take(25) 
       .ToList(); 
} 

// Action method 

public JsonResult ClientAutocompleteJSON(string term) { 

    var customers = customerService.FindCustomers(term) 
         .Select(c => new 
         { 
          id = c.CustomerID, 
          label = c.ContactName, 
          value = c.ContactName 
         }); 

    return Json(customers, JsonRequestBehavior.AllowGet); 
} 

此代码是更可重复使用的 - 例如,你可以使用相同的服务方法提供一个简单的HTML搜索表单。

0

我知道Ruby on Rails中的特征,在那里,你可以定义你的方法是能够根据客户的偏好返回JSON或XML或HTML的,这将是一个很好的功能,如果你可以找到一个图书馆,可以为你做到这一点。这可能是通过动态代理服务可以实现的一个方面。