为什么要使用" new"适用于" ActionLink"中的路线值 - - 例如

时间:2014-03-25 19:34:37

标签: asp.net-mvc

我有以下两个例子:

     @Html.ActionLink("Create New", "Create", new { id = Model.Id })

     return RedirectToAction("Index", new { id = review.RestaurantId });

我的问题是关于对象路由值中的新{id = xxx}部分。为什么我们在这种情况下使用“新”?它到底是做什么用的?在这种情况下它是否初始化“id”变量?

另外,奇怪的是这些方法,create和index定义只能接受路由值中定义的参数......

即,

     public ActionResult create { int id)
     { ...} 

是正确的但以下是错误的....

     public ActionResult create { int somethingelse)
     { ...}

所以请告诉我前两个例子中的新{id = xx}是做什么的?

由于

3 个答案:

答案 0 :(得分:1)

new {}创建一个Object类型的新对象。类型是匿名的。在编写以"结尾的linq查询时,您会看到该语法。选择新的{x =" foo"。 Y ="杆"}&#34 ;.在将对象设置为" var"时经常使用它。

您在ActionLink中所做的是提供路线值。 MVC获取对象中的属性和值,并将它们放入请求的QueryString中。你可以称之为"魔术"。您可以在控制器Action中设置断点并检查" HttpContext.Request.QueryString"看到它。

您的输入值Action方法必须与通过QueryString传递的属性相匹配。

答案 1 :(得分:0)

这实际上是创建一个匿名类型的对象并将其传递给ActionLink()。然后,ActionLink使用该对象,并结合您的路由规则来生成链接。 MVC将在该对象上查找与路由名称(通常是路由参数)匹配的属性,并找出如何构建它。由于您可能具有默认的MVC路由(/ controller / action / {id}),因此将所有内容链接在一起。

此外,这就是为什么id“是正确的”,但有些“错误”。

如果您在路由规则中将“id”更改为“somethingelse”,则可以在ActionLink()中看到新的{soemthingelse =“”}。

这有帮助吗?

答案 2 :(得分:0)

在这两种情况下,您都要创建一个新的匿名对象,以作为路由值传递给查询字符串。您创建了一个新对象,因为视图中尚不存在该对象。

MVC源代码:

  if (additionalViewData != null) {
            foreach (KeyValuePair<string, object> kvp in new RouteValueDictionary(additionalViewData)) {
                viewData[kvp.Key] = kvp.Value;
            }
        }

他们用它来创建新的RouteValueDictionary参数。

你不必使用这个庄园。您可以在模型上创建一个对象并将其传递给:

 public class SomeModel
 {

      public SomeModel()
      {
          MyObject = new { id = 10 };
      }

      public int Id {get;set;}
      public object MyObject {get;set;}
 }

 @Html.ActionLink("Create New", "Create", Model.MyObject)

这也可以,但你可能不会尝试。

对于你问题的第二部分。 RouteValueDictionary按键搜索并将值分配给给定的键。

因此,无论您在匿名对象中调用密钥,MVC都会尝试在操作上为其分配值。名称必须匹配,否则密钥无法分配值。