2013-12-12 29 views
0

在MVC應用程序,當你想從傳遞一個ID這樣的例子:MVC爲什麼只有匿名類型通過?

@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是type的產品,則不傳遞Id。這個怎麼用?

回答

1

創建像new {Model.ProductID}匿名類

真要創建對象,像這樣:

new {ProductId = Model.ProductID} 

哪個Url.Action會寫出來的&ProductId=123

默認的model binder不區分大小寫,將能夠將其映射到您的GetImage控制器方法的int productId簽名。

Model.ProductID只是一個整數 - 通常只在默認的MapRoute中映射到id

+0

謝謝,主要是清除了它,然而我想問一下,如果有方法通過方法簽名告訴我,匿名類型是我必須使用的一種方法才能正常工作?例如,我還注意到,通過MapRoutes添加路由時,默認屬性也是由匿名類型創建的。是否每當一個方法簽名期望和對象類型,我應該使用匿名類型? –

+0

嗨安德魯 - 這是所有與輔助方法生成的HTTP查詢字符串(或POST數據),如'Url.Action',只要它產生一個像URL http:// somesite/someapp/mycontroller/GetImage ?productId參數= 12345'。我不太清楚爲什麼MS注意在MapRoutes中使用匿名類型,因爲這顯然需要反思:) – StuartLC

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

如果你不告訴使用哪個參數的框架,它會創建一個歧義。