Asp.Net MVC Ajax和加载页面的方面(查看)

时间:2009-10-13 13:13:41

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

我现在有一个很好的MVC应用程序,我正在添加一些AJax功能。我有一个显示10个项目的表,只有某些用户可以看到某些项目。当用户添加新帖子时,我已设置ajax以保存新条目。

然而,我需要更新表,我无法从JQuery中找出用户的状态(因此他们可以看到)所以我不能插入一个新行(因为有些用户无法看到该行)。如果这是web-forms我会喜欢有一个转储表的页面,然后我会使用JQuery将那个trimed down'page'的内容加载到当前页面的相关插槽中。

使用MVC实现这一目标的最佳方式是什么?

由于

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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>

答案 2 :(得分:0)

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

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

这里有各种各样的细节......

  1. 定时器应该多久触发一次,以便及时获取更新,但不会给服务器带来太多流量
  2. 您是否只需更新整个列表(这会使代码变得简单)或者您应该只下载新项目(这会使逻辑更复杂,但也会使流量更小)
  3. 如何确保正确识别用户,并正确过滤条目以仅显示相关条目。
  4. 这是一个相对简单的场景 - 而且并不常见 - 但需要以合理的方式处理,以防止复杂化设置。

答案 3 :(得分:0)

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

你究竟需要什么?