2009-10-13 51 views
0

我有一个不错的MVC应用程序现在运行,并且我添加了一些AJax功能。我有一个显示10个项目的表格,只有某些用户可以看到某些项目。当用户添加新帖子时,我设置了ajax来保存新条目。然后我需要更新表,我无法从JQuery中发现用户是什么状态(因此他们可以看到),所以我不能只插入一个新行(因为一些用户不能看到该行)。如果这是网络表单,我可能会有一个转储表的页面,然后我会使用JQuery将这个页面的内容加载到当前页面的相关插槽中。Asp.Net MVC Ajax和页面的加载方面(查看)

用MVC实现这个最好的方法是什么?

感谢

+1

你不能用一个类似[Authorize(Roles =“Admin”)]的授权标签来修饰你的控制器动作。只有此角色的用户才能插入该行。 JQuery可以调用控制器方法。 – Davy 2009-10-13 13:25:08

回答

1

正如@Robert Koritnik所建议的,处理这个问题的最好方法是使用PartialView。我建议有两个单独的控制器动作 - 一个处理原始请求,另一个处理AJAX新条目。这两个操作都会调用相同的逻辑来获取表格的数据。前者将数据与其他页面数据一起放入视图模型中。后者会将数据打包到局部视图的模型中。

模型类

public class PageViewModel 
{ 
    .... 
    public IEnumerable<TableViewModel> TableData { get; set; } 
} 

public class TableViewModel 
{ 
    ... 
} 

控制器代码

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() 
{ 
    var model = new PageViewModel(); 
    model.TableData = GetTableForUser(this.User); 

    return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddEntry(...) 
{ 
    ... add the new entry ... 
    var model = GetTableForUser(this.User); 

    return PartialView("TableView", model); 
} 


private TableViewModel GetTableForUser(IIdentity user) 
{ 
    ... 
} 

查看代码

主视图

<% Html.RenderPartial("TableView", model.TableData); %> 

<script type="text/javascript"> 
    $('#entryForm').submit(function() { 
     $.post('<%= Url.Action("addentry", "controller") %>', 
       $('#entryForm').serialize(), 
       function(data) { 
        $('#table').replaceWith(data); 
       }, 
       'html'); 
     return false; 
    }); 
</script> 

的TableView

<table id="table"> 
<% foreach (var row in Model) { %> 
    <tr> 
    ... 
    </tr> 
<% } %> 
</table> 
1

使用PartialView功能,将只返回<table>你的需要。在您的主页中,它将被包含,但在您的Ajax调用中,它只会将HTML发送回客户端,您可以使用它来替换现有的<table>元素。

+0

这似乎是我在找什么。然而,我怎样才能通过JQuery的AJAX添加一个局部视图到页面,每当我尝试导航到一个局部视图,我得到的404。 THanks – LiamB 2009-10-13 13:30:13

0

如果我正确理解你,你说的是用户A正在查看条目列表,并且用户B(在世界的其他地方也许)发布了一个新条目。您希望用户A屏幕上的列表进行更新,但只有当新条目是允许用户A查看的条目时才会更新?

如果是这种情况,可以在页面上运行一个计时器,当计时器触发时,它会引发一个AJAX调用服务器,询问用户是否有新条目。用户的身份和 - 因此 - 他们可以看到哪些项目,应该从会话中确定(具体如何工作取决于您的特定架构,但我猜你已经这样做了,以显示用户A使用的项目开始)

有各种细节考虑这里......

  1. 应该多久定时器触发,以获得及时的更新,但没有导致服务器流量太大
  2. 如果您只是更新整个列表(这会使代码变得简单),或者您应该只下载新的项目(这会使逻辑更加复杂,b ut也保持流量更小)
  3. 如何确保您正确识别用户,并正确过滤条目以仅显示相关条目。

这是一个相对简单的场景 - 和那些没有太罕见 - 但它需要以合理的方式来加以处理,以防止并发症设定

0

不难添加将存储一个cookie用户的当前状态,或者您可以简单地添加另一个Ajax调用来确定用户是否已授权或不授权。您只需在您的控制器中创建一些项目以处理所有情况:无论用户是授权用户还是不用用户,您显示/隐藏了哪些内容。

你究竟需要什么?