我有以下两个例子:
@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}是做什么的?
由于
答案 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都会尝试在操作上为其分配值。名称必须匹配,否则密钥无法分配值。