我在ChildAction或Razor视图中遗漏了什么

时间:2013-06-16 15:55:10

标签: asp.net-mvc-4

我的控制器中有一个子动作,它将图像返回到我视图中的图像标记,该图像标记通过@ Url.action调用动作。我的问题是,当我从动作中移除ChildActionOnly属性时,图像呈现但是当我将其添加回来时它不会。我需要操作来携带此属性,因此无法直接调用它。以下是我的代码。

[ChildActionOnly]
 public ActionResult  GetImage(int id)
        {
            var photo = _Db.Photozs.Single(p => p.PhotozId == id);
            string path = Server.MapPath("~/Photo"+photo.Url);
            var fs = new FileStream(path, FileMode.Open);
            return new FileStreamResult(fs, photo.ContentType);
        }

这是我的观点

@model IEnumerable<okay.models.photoz>

@{
    ViewBag.Title = "Index";
}
<<div class="container-fluid">

    @foreach (var item in Model)
    {
        <div class="pull-left span3">
            <img class="img-polaroid" src="@Url.Action("GetImage",new{id=item.PhotozId})"/>
            <div class="text-center">@item.Caption</div>
        </div>
    }
</div>

非常感谢你们的帮助

2 个答案:

答案 0 :(得分:1)

您的方法正确,但您在错误的位置使用[ChildAction]只需删除它。

[ChildActionOnly]属性表示一个属性,用于指示应仅将动作方法作为子动作调用。

您没有将方法作为子操作执行,因此在放置该属性后它不会执行。此外,子操作方法为视图的一部分呈现内联HTML标记,而不是呈现整个视图。

  • 任何标有ChildActionOnlyAttribute的方法都只能使用Html.Action()Html.RenderAction() HTML帮助程序扩展方法进行调用。

答案 1 :(得分:0)

  

我的问题是当我从中删除ChildActionOnly属性时   图像渲染的动作但是当我将其添加回来时它不会

仅对使用[ChildActionOnly]Html.Action帮助程序呈现的操作使用Html.RenderAction属性。这些操作永远不会使用直接HTTP请求从客户端直接访问。当您将src标记的<img>属性指向服务器端端点时,浏览器正在向此端点发送HTTP请求。如果相应的端点用[ChildActionOnly]修饰,则无法将其呈现给客户端。

因此,如果您希望使用HTTP请求从客户端直接访问此操作,则应从控制器操作中删除此属性。