2010-06-22 75 views
0

因此,我有一个主页,其中有一个图像whos源是控制器操作返回文件流。在基于登录用户的主页上显示图像

每个登录用户的图像都会有所不同。

现在在我的母版页视图我有这个代码,这依赖于viewdata。

<img id="dealerlogo" src='/Files/DealerImage/GetDealerLogo/<%=Html.Encode(ViewData["dealerid"]) %>' alt="" /> 

显然这个问题是我需要提供包含ID 上everycontroller行动恢复使用该母版页,这是几乎所有的人的视图的可视数据。 有没有更好的方法来做到这一点?喜欢有没有办法在视图中获取用户名? 谢谢!

回答

1

您可以像创建新的asp.net MVC站点时为您创建的默认logonusercontrol.aspx一样使用Page.User.Identity.Name。因此,对于你

Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b> 

,你会想是这样的:

<img id="dealerlogo" src='/Files/DealerImage/GetDealerLogo/<%=Html.Encode(Page.User.Identity.Name) %>' alt="" /> 
+0

这就是我正在寻找的完美!谢谢! – twal 2010-06-22 14:19:45

0

我假设你GetDealerLogo操作方法有dealerid的参数。最好是写下类似的东西:

<img src="<%= Url.Action("GetDealerLogo", "DealerImage", new { dealerid = ViewData["dealerid"] }) %>" /> 

传递它通过ViewData没有错。您也可以考虑使用strongly-typed View或您自己的ViewPage base class,这会暴露DealerId属性。

为了使它更干净,我真的很喜欢T4MVC。这将允许你写:

<img src="<%= Url.Action(MVC.DealerImage.GetDealerLogo(dealerid)) %>" /> 

而且,更进一步,您可以创建一个Html helper,所以你可以写:

<%= Html.DealerLogo(dealerid) %> 
2

你可以很容易地在[ChildActionOnly]行动,返回一个封装这一逻辑局部视图,然后使用新的MVC 2方法

<% Html.RenderAction("GetUserPhoto", "User"); %> 

在您的视图页无处不在,而无需在所有操作中传递ViewData。

这里的解决方案:

[ChildActionOnly] 
public ActionResult GetUserPhoto() 
{ 
    ViewData["UserId"] = Page.User.Identity; 
    return PartialView(); 
} 

而且在你看来,你用你用来显示用户图像相同的逻辑。您也可以直接发送FileResult到局部视图来为您呈现图像。在这种方法中,您无需在所有视图中重复ViewData["XXXX"],只需在主视图中渲染新的局部视图。

+0

我真的很喜欢这种方法,谢谢。 – twal 2010-06-22 20:24:17

相关问题