我正在编写一个使用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
的视图模型,并且感觉非常糟糕。
答案 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;
}