Asp.net mvc MVC为什么只传递匿名类型?
在MVC应用程序中,当您希望从服务器传递id时,例如: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}时
@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 }
);