在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})"/>
对于这样的控制器动作方法:
public FileContentResult GetImage(int productId)
{
Product prod = repository.Products.FirstOrDefault
(p => p.ProductID == productId);
if (prod != null)
{
return File(prod.ImageData, prod.ImageMimeType);
}
else {
return null;
}
}
为什么它只能在我使用匿名新的{Model.ProductID}时才有效?当我尝试传递Model.ProductID时,如果Model是product类型,则不传递Id。这是如何工作的?
答案 0 :(得分:1)
创建像new {Model.ProductID}
实际上会像这样创建对象:
new {ProductId = Model.ProductID}
哪个Url.Action
会写为&ProductId=123
默认的模型绑定器不区分大小写,并且可以将其映射到int productId
控制器方法的GetImage
签名。
而Model.ProductID
只是一个整数 - 通常只会映射到默认id
中的MapRoute
。
答案 1 :(得分:1)
ASP.NET MVC使用RouteValueDictionary实例中的匿名对象或键中的属性名称来匹配路由参数的值。例如,ASP.NET MVC中的默认路由有3个路由参数:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
如果您没有告诉框架要使用哪个参数,则会产生歧义。