强制调用部分视图内的操作以重新执行

时间:2012-12-04 07:51:50

标签: ajax asp.net-mvc asp.net-mvc-3

我知道这个问题已在SO上多次得到解决,但对于我的生活,我无法让它工作,所提出的解决方案都没有为我解决问题。所以这是场景,我有一个主要表单,用户输入一些数据,并上传图片。上传是通过ajax(使用valum的文件上传器)进行的,因此文件一上传就会发布到控制器,然后调整图片服务器端的大小并返回包含在局部视图中的缩略图。部分视图与用户输入其详细信息的视图相同。这一切都在第一次完美正常,文件被发送到服务器并生成缩略图并返回到局部视图,但这不会发生第二次。这是Main表单,包含要返回部分视图的部分(ThumbnailDiv):

@using (Html.BeginForm("Upload","Home", FormMethod.Post)) 
{
    @Html.ValidationSummary(true)
    <fieldset >
      //Some input fields
      //Uploader
            <div id="file-uploader">
                <noscript>
                    <p>Please enable JavaScript to use file uploader.</p>
                </noscript>
            </div>
    </fieldset>
}
        <input type="submit" value="View thumbnail" id="btnGetThumbnail" />
        <div id="ThumbnailDiv" style="float: right;width: 500px; height: 500px;">
        </div>


<script type="text/javascript">
    $(document).ready(function () {
        $("#btnGetThumbnail").click(function (e) {
            e.preventDefault();

            var myDiv = $('#ThumbnailDiv');
            $.ajax({
                url: '@Url.Action("GetThumbnail", "Home")',
                type: 'GET',
                cache: false,
                success: function (result) {
                    myDiv.html(result);
                }
            });

        });
    });

</script>

以下是Home控制器上的GetThumbnail操作:

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public ActionResult GetThumbnail()
    {
        ViewBag.TheTime = System.DateTime.Now.ToString();
        return PartialView("~/Views/Home/ThumbnailFinal.cshtml",mvm);
    }

我将当前时间传递给局部视图以检查请求是否正在更新,但是我似乎无法告诉视图重新呈现缩略图图像。这是部分视图(ThumbnailFinal.cshmtl):

@ViewBag.TheTime

<img src="@Url.Action("GenerateThumbnail")" alt="" />

问题:

图像未刷新,无法再次调用GenerateThumbnail操作。时间正在更新,因此我知道调用GetThumbnail操作,但图像不是第二次调用GenerateThumbnail操作。我该如何解决这个问题?有没有更好的方法从局部视图中的动作渲染图像?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

看起来图像缓存在客户端上。您可以通过附加随机查询字符串参数来破坏缓存:

<img src="@Url.Action("GenerateThumbnail", new { seed = DateTime.UtcNow.Ticks })" alt="" />

或禁用GenerateThumbnail控制器操作上的缓存,方法是使用[OutputCache]属性进行修饰,就像使用GetThumbnail操作一样。