根据登录用户在母版页上显示图像

时间:2010-06-22 02:19:42

标签: asp.net-mvc

所以我有一个主页,其中包含一个图像,其中source是一个返回文件流的控制器操作。

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

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

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

显然这个问题是我需要提供包含ID的viewdata 在每个控制器操作上返回一个使用这个主页的视图,这几乎都是它们。 有一个更好的方法吗?喜欢有没有办法在视图中获得用户名? 谢谢!

3 个答案:

答案 0 :(得分:2)

您可以轻松地将此逻辑封装在[ChildActionOnly] Action中,该Action返回部分视图,然后使用新的MVC 2方法

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

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

以下是解决方案:

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

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

答案 1 :(得分:1)

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

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

所以对你来说,你会想要这样的东西:

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

答案 2 :(得分:0)

我假设你的GetDealerLogo动作方法有一个dealerid参数。最好写一些类似的东西:

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

通过ViewData传递它没有错。您可能还会考虑公开DealerId属性的strongly-typed View或您自己的ViewPage base class

为了使它更干净,我真的很喜欢T4MVC。它可以让你写:

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

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

<%= Html.DealerLogo(dealerid) %>