在MVC Action Method中创建超链接

时间:2010-06-24 13:16:02

标签: c# .net asp.net asp.net-mvc linq

我有一个操作方法在我的控制器中返回JsonResult

    public JsonResult GetDetails()
    {
        var rows = //Linq-To-SQL
        //Linq-To-Entities
        var lifts = (from r in rows
                     group r by new { r.LiftID, r.LiftDate } into g
                     select new
                     {
                         ID = g.Key.LiftID,
                         Date = g.Key.LiftDate.ToShortDateString(),
                         Driver = g.Where(x => x.IsDriver)
                                    .Select(x => x.p).Single().Name,
                         Passengers = g.Where(x => !x.IsDriver)
                                        .Select(x => x.p.Name)
                                        .Aggregate((x, y) => x + ", " + y)
                     }).ToList();
        return Json(lifts);
    }

我在jQuery脚本中使用结果写出一个表。

数据如下:

ID |日期|司机|乘客

1 | 20/06/2010 |大卫尼尔|约翰史密斯,保罗琼斯

等...

我希望这些名称是到路由Person\{id}的超链接。 <a href="\Person\7">David Neale</a>p属性对应于包含PersonName的{​​{1}}对象。

我不想手动构建URL。如何构建对象以使用MVC路由引擎将名称包含为超链接?

3 个答案:

答案 0 :(得分:1)

这很容易。

只需使用Url.Action(“actionName”,“controllerName”,params)

它将使用路由引擎创建一个字符串,因此如果您更改路由,您的代码将保持正常工作

答案 1 :(得分:0)

首先,我认为您的modelLinq-To-SQLLinq-To-Entities查询中存在错误。因为你没有 ID为你的人(司机和通道),如果你想要一个带有人的身份证的链接,你肯定会需要它。我认为您需要从人员中拆分 Lifts 并拥有 2个单独的实体(当然是通过其ID进行链接)。

其次,您需要将人员的ID从Controller传递给视图。

class Lift
{
    public int LiftID { get; set; }
    public DateTime LiftDate { get; set; }
    public IEnumerable<Person> p { get; set; }
}
class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsDriver { get; set; }
}
public JsonResult GetDetails()
{
    var rows = new Lift[] { //Linq-To-SQL and Linq-To-Entities replaced by an example
        new Lift{LiftID = 1, LiftDate= DateTime.Now, p = new Person[] {
            new Person{IsDriver = true,  Id = 1, Name = "David Neale"},
            new Person{IsDriver = false, Id = 2, Name = "John Smith"},
            new Person{IsDriver = false, Id = 3, Name = "Paul Jones"}
        }},
        new Lift{LiftID = 2, LiftDate= DateTime.Now, p = p = new Person[] {
            new Person{IsDriver = true,  Id = 4, Name = "Daniel Faraday"},
            new Person{IsDriver = false, Id = 2, Name = "John Smith"}
        }}
    };
    var lifts = (from r in rows
                 select new
                 {
                     ID = r.LiftID,
                     Date = r.LiftDate.ToShortDateString(),
                     Driver = r.p.Where(x => x.IsDriver)
                                 .Select(x => x.Name).Single(),
                     Passengers = r.p.Where(x => !x.IsDriver)
                                     .Select(x => x.Name)
                                     .Aggregate((x, y) => x + ", " + y)
                 }).ToList();
    return Json(lifts);
}

然后,一旦您在视图上获得了ID,就可以使用它来使用Html.ActionLink建立链接:

<%= Html.ActionLink("Person", "Index", new { id = p.Id })%>

答案 2 :(得分:0)

如果您事先知道动作和控制器,您可以执行以下操作:

var baseURL = '<%=Url.Action("MyAction","MyController") %>';

然后从jQuery手动构建链接,href设置为baseUrl+"/"+personId