代码之家  ›  专栏  ›  技术社区  ›  tags2k

json操作的MVC命名约定

  •  6
  • tags2k  · 技术社区  · 17 年前

    在编写一个既有前端路径又有JSON路径的MVC应用程序时,建议使用什么命名约定?

    例如,假设您站点的用户拥有“东西”。他们应该能够访问一个页面来查看他们的东西,但是我们也需要一种方法将这些东西作为JSON放在其他页面上。我已经考虑了好几种选择,但我对其中任何一种都不感兴趣。以下是我的资料:

    1. 事物/目录 对于用户界面, JSON/事物 对于JSON,这将需要一个JSONController,它最终将服务于不同类型的对象,从而在我们开始之前消除任何实体分离的机会。
    2. 事物/目录 对于用户界面, /物品/清单/json 对于JSON——可能是我目前的首选选项,但需要神奇的字符串(尽管只是“JSON”)。此外,如果您还需要(字符串ID)操作签名来接受某些筛选参数或类似参数,那么您可以选择添加一个额外的路由或执行一些不干净的字符串拆分。
    3. /帐户/神话 对于用户界面, 事物/目录 对于JSON来说——稍微干净一点,但是可能并不总是有一个相关的控制器,您可以从中服务“事物”。另外,你又在混合实体了。

    欢迎提出所有建议,谢谢!

    4 回复  |  直到 9 年前
        1
  •  15
  •   Peter Bratton    17 年前

    可以说,路径名可能都是相同的。您可以检查客户机所需响应的mime类型的accept头,然后根据在其中找到的内容返回适当的视图:

    • application/json:json视图
    • 文本/xml:xml视图
    • 文本/纯文本,文本/html:jsp 视图

    浏览器将此字段设置为HTML;您的JSON客户机只需将此字段设置为适当的。

        2
  •  1
  •   tvanfosson    17 年前

    任何人都不太可能在请求JSON的URL上做书签,所以我认为保持该URL的整洁并不重要。它也可能是以编程方式生成的,而不是手工输入的。考虑到这些,我将考虑将其添加为查询参数。

     /things/list  -- HTML
     /things/list?format=json  -- JSON 
    

    如果您有ID参数或者需要其他参数,这不会破坏您的URL。它还可以与posts和get一起工作。

    /things/1  -- HTML for "thing 1"
    /things/1?format=json -- JSON for "thing 1"
    
        3
  •  1
  •   D'Arcy Rittich    17 年前

    我使用的惯例是

    /things/list -- HTML
    /things/_listpage -- AJAX
    

    规则是所有未加引号的操作/视图都有一个前导下划线。这告诉我,它们从未被称为顶级,并且通常没有关联的母版页。在这种情况下,我将操作保存在同一个控制器下,以便共享任何相关的逻辑。

    通常在列表视图中

    <% RenderAction("_listpage", "things", new {page = ViewData["CURRENT_PAGE"]}); %>
    
        4
  •  -1
  •   Dave    12 年前

    我建议对@redfilter的建议进行细微的修改/细化。

    /things/list -- HTML
    /things/_list -- return HTML help and examples (more for you than them).
    /things/_list/schema -- schema info
    /things/_list/json -- JSON format
    /things/_list/xml -- XML format
    /things/_list/csv -- csv format
    /things/_list/tab -- tab deliminated format
    /things/_list/wdsl -- implemented soap web service
    

    等。。我觉得它更具可扩展性。它看起来很吓人,但是很容易通过一个基于所请求格式的修饰器传递数据内容,使整个文件格式主机几乎只需要几行代码就可以使用。

    下面是一个粗略的概念示例:

    public ActionResult _list(string id)
    {
        string data = "";
        DataTable oDataTable = this.oDAO.Get("list"); // pretend data retrieval
    
        try{
            if(!String.IsNullOrEmpty(id)){
                data = this.oDecorator.FormatData(id,oDataTable);
                this.ContentTypeChange(id); // change application handler
            }else{
                data = this.GetHelp("_list");
            }           
        }catch{}
        ViewData["data"] = data;
        return View();
    }
    

    …帮助可以是更多的功能列表、技术示例或您想要的任何内容。当然,您可以从拥有本机JSON开始,并随着需求的增长向您的装饰器添加更多的数据格式,这很好。对于我的许多项目来说,它从Ajax的纯JSON REST开始,并趋向于以站点流行程度为基础,扩展到其他需要的格式,因此我发现这种强大的功能足以用于企业环境中经常增长的小型项目。

    推荐文章