我现在有一个很好的MVC应用程序,我正在添加一些AJax功能。我有一个显示10个项目的表,只有某些用户可以看到某些项目。当用户添加新帖子时,我已设置ajax以保存新条目。
然而,我需要更新表,我无法从JQuery中找出用户的状态(因此他们可以看到)所以我不能插入一个新行(因为有些用户无法看到该行)。如果这是web-forms我会喜欢有一个转储表的页面,然后我会使用JQuery将那个trimed down'page'的内容加载到当前页面的相关插槽中。
使用MVC实现这一目标的最佳方式是什么?
由于
答案 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开始的项目)
这里有各种各样的细节......
这是一个相对简单的场景 - 而且并不常见 - 但需要以合理的方式处理,以防止复杂化设置。
答案 3 :(得分:0)
添加一个存储用户当前状态的cookie并不难,或者您可以简单地添加另一个Ajax调用来查明用户是否被授权。您只需在控制器中创建一些项目来处理所有情况:用户是否被授权,您显示/隐藏它们的内容。
你究竟需要什么?