MVC为什么只传递匿名类型?

时间:2013-12-12 09:11:12

标签: 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})"/>

对于这样的控制器动作方法:

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。这是如何工作的?

2 个答案:

答案 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 }
);

如果您没有告诉框架要使用哪个参数,则会产生歧义。