将ASP.NET MVC路由URL添加到视图模型对象(用于JSON)

时间:2012-02-23 16:37:52

标签: ajax asp.net-mvc json asp.net-mvc-3 knockout.js

我正在编写一个使用ASP.NET MVC和JSON.NET作为服务器的应用程序,将JSON发送到客户端,由Knockout读取,然后显示数据绑定。除了一个问题外,这一切都非常有效:

我有一个类Customer用于生成ReviewAuthorViewModel类 - 后者专门用于JSON序列化并删除不必要的字段,循环引用等。在客户端上,我想要呈现指向客户的个人资料页面的链接,其URL来自定义的MVC路由“user / {username}”。因为我是通过JSON发送的,所以我没有.cshtml页面,我可以在其中调用Url.Action

问题是:对于任意对象,如何在没有.cshtml视图的情况下,如何最有效/优雅地获取包含某些数据的操作的URL?

我更喜欢在每个操作中不需要额外代码的解决方案,但除了在JavaScript中重新创建客户端路由表之外,这可能是唯一的选择。以下是我已经尝试过的事情,以及每个事情都不令人满意的事情。

解决方案尝试1

调用UrlHelper.Action课程中的ReviewAuthorViewModel方法。但是,UrlHelper需要请求上下文。为了分离关注点,我不希望我的视图模型依赖于System.Web.Routing,也不希望它需要请求上下文来运行。

解决方案尝试2

创建一个包含Controller,Action和Data成员的类RouteInformation,以及一个具有两个属性的接口IUrlViewModel,一个类型为RouteInformation的get和一个名为{{的get / set字符串1}}。然后,需要链接的视图模型实现此接口,控制器查找类型为Url的视图模型,并使用视图模型的IUrlViewModel实例中的信息运行UrlHelper.Action,并将结果存储在Url中属性。

这个工作但没有反射我不知道如何在其他视图模型中找到实现RouteInformation的视图模型,并且感觉非常糟糕。

1 个答案:

答案 0 :(得分:0)

解决方案尝试1 是正常的解决方案。在asp.net-mvc中,视图模型是表示层的一部分,专门用于视图。你不应该担心视图模型依赖于asp.net特定的东西。实际上,它们应该是耦合的,因为它们应该被设计为最大化Web服务器和Web客户端之间的视图生成和数据交换的简单性。这是创建单独的视图模型并且不直接为客户端使用Customer类的好方法。如果Customer依赖于Routing,那就不行了。

实际上,您可以在控制器中设置该属性 -

    [HttpGet]
    public ActionResult Get()
    {
        var viewModel = new ReviewAuthorViewModel();
        viewModel.ProfilePageUrl = Url.Action("Index", "Profile");

        // return viewModel;
    }