关于Html.ActionLink帮助器的问题 - 特别是对象routeValues参数的语法

时间:2010-11-21 23:45:30

标签: c# model-view-controller

所以我理解ActionLink HTML帮助器的使用,以及大多数参数。我仍在围绕对象routeValues参数的完整使用范围进行包装。

但是,我的问题是,对于routeValues参数,您可以将对象指定为ViewData字典中的现有对象:

Html.ActionLink("Some Text", "Edit", Model.ProductId);

或者您可以使用对象初始化语法:

Html.ActionLink("Some Text", "Edit", new { Model.ProductId });

我的2个问题,是

A)使用另一个的定义理由是什么?我很难理解为什么你必须初始化一个新的,因为你已经在模型中拥有了具有正确值的属性。

B)我理解实例化一个新对象(即var someVar = new SomeObject()),但你在上面的例子中定义了什么(new {Model.ProductID})并指定了一个属性?

谢谢,

3 个答案:

答案 0 :(得分:0)

您可能希望将其他值发送到控制器操作

示例:

Html.ActionLink("Some Text", "Edit", new { id=Model.ProductId, myotherValue=1 });

你的控制动作是这样的

Public ActionResult Edit(int id, int myotherValue);

答案 1 :(得分:0)

AFAIK,两者都不正确。当您指定不是RouteValueDictionary的对象(通常是匿名对象)时,它会通过对对象属性的反射将属性/值对传输到字典中。在这两种情况下,您都不会使用将获得的对象转换为包含带有关联值的id键的RouteValueDictionary。在第二种情况下,我认为你甚至没有合法的语法它不会在给定默认路由的情况下正确映射到id参数。您需要的语法是:

Html.ActionLink("Some Text", "Edit", new { id = Model.ProductId } );

您正在创建一个匿名对象,其id属性的值为Model.ProductId。这将导致RouteValueDictionary的id键映射到Model.ProductId的值。

答案 2 :(得分:0)

B)语法new { id = 1, name = "11" }表示“创建匿名对象”。在构建过程中,编译器会查找所有这些用法,并在程序集中创建具有不可读名称的类,如下所示:

class AnonymousType`1
{
    int id {get; private set};
    int name {get; private set};
}

然后所有引用都更改为代码,如new <>AnonymousType`1{ id = 1, name = "11" } 它只是对它如何工作的描述,生成的代码稍微复杂一些。

A)你看,Model.ProductId是int,而new { Model.ProductId }是某种类型的实例,由编译器生成。

您可以使用Reflector检查这一点。有关Anonymous Types

的更多信息