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

Get the name of view who called controller in ASP.NET MVC

是否有任何方法可以获取调用控制器中方法的视图的名称并将其保存在该控制器方法内的某个自定义变量中?

例如:

我有一个视图使用 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>

我在两个页面上使用这个视图。在一种情况下,我使用它仅显示来自特定用户(已登录用户)的 posts,而在另一种情况下,我正在显示来自数据库中所有用户的 posts(类似到 Facebook 墙,在那里你只能看到你的 post,而 NewsFeed 在那里你不仅可以看到你的,还可以看到你朋友的 post。

出于某种原因,我想知道在调用 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 获取 posts,它用于在滚动时显示更多 posts。

您可以像这样在 html 中创建隐藏变量 -

<input type="hidden" id="pageName" value="myPage1" />

为您的操作添加额外参数 -

public ActionResult InfiniteScroll(int BlockNumber, int pageName)

然后,在您的 jquery 代码中,当您 post 时,也发送 pageName。

$.post("@Url.Action("InfinateScroll", "Posts")", { "BlockNumber": BlockNumber, "pageName": $('#pageName').val() },

希望对您有所帮助。

您可以使用以下方法从视图内部获取当前视图的名称:

@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)

In one case I'm using it to show only posts from specific user... and on the other view I'm showing posts from all users in database...

将您想要的逻辑放在视图上是不安全的,尤其是在显示数据是基于用户或特定于用户的情况下。但是,如果您坚持在视图上使用逻辑,那么您应该像这样将另一个变量传递给控制器​​:

$.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
}

但就像我提到的那样,这是不安全的,因为有人可以轻松地传递有效的 "userId" 并在您不希望他们这样做时获取数据。所以最安全(或更安全)的方法是让 "filtering logic" 在你的控制器中像这样:

[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" 
}