Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC为什么只传递匿名类型?_Asp.net Mvc_Asp.net Mvc 4_Anonymous Function - Fatal编程技术网

Asp.net mvc MVC为什么只传递匿名类型?

Asp.net mvc MVC为什么只传递匿名类型?,asp.net-mvc,asp.net-mvc-4,anonymous-function,Asp.net Mvc,Asp.net Mvc 4,Anonymous Function,在MVC应用程序中,当您希望从服务器传递id时,例如: @if (Model.ImageData != null) { <div style="float:left; margin-right:20px"> <img width="75" height="75" src="@Url.Action("GetImage", "Product", new {Model.ProductID})"/> 为什么只有在我使用匿名新{Model.ProductID}时

在MVC应用程序中,当您希望从服务器传递id时,例如:

@if (Model.ImageData != null) { 
<div style="float:left; margin-right:20px">
    <img width="75" height="75" src="@Url.Action("GetImage",
    "Product", new {Model.ProductID})"/>

为什么只有在我使用匿名新{Model.ProductID}时它才能工作?当我尝试传递Model.ProductID时,由于模型的类型为product,因此没有传递Id。这是如何工作的?

创建一个匿名类,如
new{Model.ProductID}

将实际创建对象,如下所示:

new {ProductId = Model.ProductID}
哪个
Url.Action
将写为
&ProductId=123

默认模型绑定器不区分大小写,并且能够将其映射到
GetImage
控制器方法的
int-productId
签名


Model.ProductID
将只是一个整数-这通常只映射到默认
MapRoute
中的
id

ASP.NET MVC使用匿名对象中的属性名或实例中的键将值与路由参数匹配。例如,ASP.NET MVC中的默认路由有3个路由参数:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

如果您不告诉框架要使用哪个参数,这将产生歧义。

谢谢,这基本上解决了问题,但是我想问,是否有办法通过方法签名告诉框架匿名类型是我必须使用的方法才能正常工作?例如,我还注意到,通过MapRoutes添加路由时,默认属性也是由匿名类型创建的。是不是每当一个方法签名要求使用匿名类型和对象类型时,我就应该使用匿名类型?嗨,Andrew-这都与帮助器方法(如
Url.Action
)生成的HTTP查询字符串(或POST数据)有关,只要它生成一个类似
http://somesite/someapp/mycontroller/GetImage?productId=12345
。我不太清楚为什么MS会在
MapRoutes
中使用anon类型,因为这显然需要反射:)
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);