2012-02-23 18 views
0

我正在写使用ASP.NET MVC与JSON.NET作为服务器,发送JSON到由读取客户端的应用程序淘汰赛,然后显示数据绑定。这一切都工作奇妙,除了一个问题:添加ASP.NET MVC路由的网址,查看模型对象(在JSON使用)

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

现在的问题是:对于一个任意的对象,我怎样才能最有效地/优雅地获得一个数据行为的URL,没有.cshtml视图?

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

解尝试1

调用UrlHelper.Action方法在ReviewAuthorViewModel类。但是,UrlHelper需要请求上下文。为了分离问题,我不希望我的视图模型对System.Web.Routing有依赖性,也不希望它需要请求上下文来运行。

解尝试2

创建类RouteInformation与成员控制器,动作,和数据,并与两个属性的接口IUrlViewModelRouteInformation类型和命名Url一个获取/设置字符串的一个get。需要链接的视图模型然后实现此界面,并且控制器查找IUrlViewModel类型的视图模型,并使用来自视图模型的RouteInformation实例的信息运行UrlHelper.Action,将结果存储在Url属性中。

这一个作品但没有反射我不知道如何找到在其他视图模型中实现IUrlViewModel视图模型,它感觉非常kludgy。

回答

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; 
    } 
+0

你有什么建议有基本上是我做的解决方案2,抽象为一个接口,使之更容易被重用。但是,这使得很难获得应该添加URL的嵌套视图模型对象,并且必须将其添加到每个动作,这似乎是引入难以捉摸的错误的好方法。 – ehdv 2012-02-23 17:07:19

+0

我觉得第二个解决方案太复杂,过度设计。 – archil 2012-02-23 17:14:20