有没有办法在控制器中获取调用方法的View的名称,并将其保存在控制器方法中的某个自定义变量中?
例如:
我有一个View使用Ajax来获取控制器中的InfinateScroll方法:
<div class="container-post">
<div id="postListDiv">
@{Html.RenderAction("PostList", "Posts", new { Model = Model });}
</div>
<div id="loadingDiv" style="text-align: center; display: none; margin-bottom: 20px;">
<img alt="Loading" src="@Url.Content("~/images/ajax-loader.gif")" />
</div>
</div>
<script src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>
<script type="text/javascript">
var BlockNumber = 2;
var NoMoreData = false;
var inProgress = false;
$(window).scroll(function () {
if ($(window).scrollTop() == $(document).height() - $(window).height() && !NoMoreData && !inProgress) {
inProgress = true;
$("#loadingDiv").show();
$.post("@Url.Action("InfinateScroll", "Posts")", { "BlockNumber": BlockNumber },
function (data) {
BlockNumber = BlockNumber + 1;
NoMoreData = data.NoMoreData;
$("#postListDiv").append(data.HTMLString);
$("#loadingDiv").hide();
inProgress = false;
});
}
});
</script>
我在两页上使用此视图。在一个案例中,我使用它来显示来自特定用户(登录的用户)的帖子,而在另一个视图中我显示来自数据库中所有用户的帖子(类似于Facebook墙,在那里你只能看到你的帖子,以及NewsFeed,你不仅可以使用自己的帖子,还可以阅读你们的文章。
出于某种原因,我想知道在调用InfinateScroll方法时哪个页面处于活动状态。
这是我想在这两个页面之间做出一些区别的方法,所以我可以稍后检查一下。
[HttpPost]
public ActionResult InfinateScroll(int BlockNumber)
{
int BlockSize = 5;
var posts = PostManager.GetPosts(BlockNumber, BlockSize);
JsonModel jsonModel = new JsonModel();
jsonModel.NoMoreData = posts.Count < BlockSize;
jsonModel.HTMLString = RenderPartialViewToString("PostList", posts);
return Json(jsonModel);
}
此方法使用辅助方法GetPosts获取帖子,并用于在滚动时显示更多帖子。
答案 0 :(得分:2)
您可以使用以下内容从视图中获取当前视图的名称:
@Path.GetFileNameWithoutExtension(Server.MapPath(VirtualPath))
来源:How to get the current view name in asp.net MVC 3?
因此您可以将此作为路由值添加到@ Url.Action中,如下所示:
@Url.Action(
"InfinateScroll",
"Posts",
new{callingView=Path.GetFileNameWithoutExtension(Server.MapPath(VirtualPath))})
然后你可以在你的控制器方法中添加一个参数
public ActionResult InfinateScroll(int BlockNumber, string callingView)
答案 1 :(得分:1)
您可以在html中创建隐藏变量,如下所示 -
<input type="hidden" id="pageName" value="myPage1" />
为您的操作添加额外参数 -
public ActionResult InfiniteScroll(int BlockNumber, int pageName)
然后,在你的jquery代码中,当你发布时,也发送pageName。
$.post("@Url.Action("InfinateScroll", "Posts")", { "BlockNumber": BlockNumber, "pageName": $('#pageName').val() },
希望这有帮助。
答案 2 :(得分:1)
在一个案例中,我使用它只显示来自特定用户的帖子......和 在另一个视图中,我显示了数据库中所有用户的帖子......
在视图上放置所需的逻辑是不安全的,尤其是在显示数据是基于用户的或用户特定的情况下。但是,如果你坚持在视图上使用逻辑,那么你应该将另一个变量传递给控制器,如下所示:
$.post("@Url.Action("InfinateScroll", "Posts")",
{ "BlockNumber": BlockNumber, "UserId": userId },
// rest of your code goes here...
});
然后你的控制器应该有另一个参数:
[HttpPost]
public ActionResult InfinateScroll(int BlockNumber, int userId)
{
//filter your data based on the "userId" parameter
}
但就像我提到的那样,这是不安全的,因为有人可以很容易地传入有效的&#34; userId&#34;当你不想要它们时获取数据。所以最安全(或更安全)的方法是使用&#34;过滤逻辑&#34;在你的控制器中如此:
[HttpPost]
public ActionResult InfinateScroll(int BlockNumber)
{
// a context based logic
var userId = GetLoggedInUserId();
// that method could return null or zero
// and depending on how you approach it
//filter your data based on the "userId"
}