所以我有一个主页,其中包含一个图像,其中source是一个返回文件流的控制器操作。
每个登录用户的图像都不同。
现在在我的母版页视图中我有这个代码,它依赖于viewdata。
<img id="dealerlogo" src='/Files/DealerImage/GetDealerLogo/<%=Html.Encode(ViewData["dealerid"]) %>' alt="" />
显然这个问题是我需要提供包含ID的viewdata 在每个控制器操作上返回一个使用这个主页的视图,这几乎都是它们。 有一个更好的方法吗?喜欢有没有办法在视图中获得用户名? 谢谢!
答案 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) %>