获取在ASP.NET MVC中调用控制器的视图名称

时间:2015-01-20 10:45:31

标签: c# asp.net-mvc view controller asp.net-mvc-5

有没有办法在控制器中获取调用方法的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获取帖子,并用于在滚动时显示更多帖子。

3 个答案:

答案 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" 
}