2010-11-16 64 views
0

所以我有这个页面是这样的:确定何时partialview将被渲染为fullview ......并劫持渲染 - MVC

....

现在的我使用Ajax和全部更新此评论div。现在,如果用户禁用了javascript,actionresult“Comments”仍然会返回partialView,除了这次它会替换整个页面而不是div“CommentsDiv”。它破坏了页面的格式,因为masterpage已经不存在了。整个网站都有很多这样的场景。

我可以普遍指定一个像partialView即将被渲染为全视图,做某事的东西! (如可能重定向到只有引用partialview的masterpage的虚拟整页)。任何其他方法?

请注意,我根本无法执行“IsAjaxRequest”,因为第一次加载页面时,它不会是Ajax请求,但actionresult仍然应该返回partialview。

+0

实现此目的的方法是通过'Request.IsAjaxRequest',我不明白你为什么不能使用它。 – 2010-11-16 07:22:42

回答

0

如果我已经理解了关于IsAjaxRequest的第一次加载页面的意见,那么您需要完整的视图,而不是部分......但是这几乎是使用IsAjaxRequest的规范原因。

因此,所有你需要的是:

if (Request.IsAjaxRequest) 
{ 
    return View(); 
} 
else 
{ 
    return PartialView("myPartial"); 
} 

唯一的其他情况下,我能想到的是,你正在使用重定向,例如,如果实施后重定向获取模式。在这种情况下,您可以重写控制器中的OnResultExecuted方法以将IsAjaxRequest的结果存储在TempData中。

这样,当Get请求到达服务器时,您可以在TempData中检查您的变量。如果它是空的,那么它是一个“原始”请求,所以返回整个页面。否则,它是一个重定向请求,原始请求是一个Ajax请求,您可以安全地返回部分视图。即:

在控制器写属性,如下所示:

public bool ImReallyAnAjaxRequest 
{ 
    get 
    { 
     if (TempData["ImAjax"] == null) return false; 
     if (TempData.ContainsKey("ImAjax")) 
     { 
      return (bool)TempData["ImAjax"]; 
     } 
     else if (Request.IsAjaxRequest()) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

然后,写一个OnResultExecuted如下:

protected override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
    if (filterContext.Result is RedirectToRouteResult) 
    { 
     TempData[keyIsAjaxRequest] = Request.IsAjaxRequest(); 
    } 
} 

您覆盖所有的角度通过这种方式,你可以只使用ImReallyAnAjaxRequest无论在哪里,都知道它会起作用。或者说,我已经使用它来构建一个基本的WizardController,它对于Ajax是否可用是完全透明的。一件美丽的东西,非常干燥,特别是如果包装到一个基地控制器。

但是,我推测,因为你的问题不清楚。