Asp.net mvc 4 调用一个控制器方法(从外部电子邮件链接),该方法不返回视图,只是退出

Asp.net mvc 4 调用一个控制器方法(从外部电子邮件链接),该方法不返回视图,只是退出,asp.net-mvc-4,razor,controller,exit,Asp.net Mvc 4,Razor,Controller,Exit,我有一个使用Windows凭据的MVC4Razor intranet应用程序,新用户必须在其中注册(现有用户将自动重定向到主用户页)。这将向管理员生成一封批准请求电子邮件,并返回一个带有退出按钮的视图,简单地说您的应用程序已提交。然后用户关闭应用程序 电子邮件以HTML格式显示用户输入的数据,并已批准或拒绝选择。然后,它有一个按钮来调用代码,将用户插入Members表(如果接受),并向用户返回一封包含该决定的电子邮件 由于在发送给管理员的应用程序和做出决定的管理员之间可能会有一段时间,会话最初将

我有一个使用Windows凭据的MVC4Razor intranet应用程序,新用户必须在其中注册(现有用户将自动重定向到主用户页)。这将向管理员生成一封批准请求电子邮件,并返回一个带有退出按钮的视图,简单地说您的应用程序已提交。然后用户关闭应用程序

电子邮件以HTML格式显示用户输入的数据,并已批准或拒绝选择。然后,它有一个按钮来调用代码,将用户插入Members表(如果接受),并向用户返回一封包含该决定的电子邮件

由于在发送给管理员的应用程序和做出决定的管理员之间可能会有一段时间,会话最初将终止。我需要让电子邮件调用一个方法来持久化新用户,通过电子邮件发送决策,然后简单地退出。它不会以任何方式涉及浏览器,因此不涉及任何视图。我可以将其作为一个后台控制台应用程序来编写,但这将涉及到在MVC应用程序中复制大量代码——在错误修复或更新中存在引用完整性问题

我如何在控制器中编写一个方法,该方法可以通过电子邮件中的链接调用,就像从执行该操作的浏览器中调用一样,然后在不向浏览器返回任何内容的情况下退出

如果我将该方法设为ActionResult方法并返回new EmptyResult()或return(null),我假设它将尝试不返回空页面

我是否可以在我的控制器中构造一个方法,它可以访问所有的支持代码,比如

public void EnrollMember(Member member, bool decision)
{
    if (decision == true)
    {
        // insert new user into Members table
        // generate accepted email
    }
    else
    {
        // generate declined email
    }
}
然后就像我链接到Index(),/MyController/EnrollMember(…)一样链接到它

应用程序中没有main(),因为它是ASP.NET MVC应用程序,我不知道如何从控制器方法中终止应用程序,而不尝试返回某些内容,而不是从浏览器中的视图

我是一个长期的程序员,但是一个.NET新手,所以这可能有一个简单的答案。

视图只是一个响应。您不必返回视图,但必须返回响应。这是没有办法的。如果链接在浏览器中打开,则无论如何都会显示一些内容。即使您只是返回一个空的
ContentResult
,浏览器中至少会显示一个空白页面

要实现与您所寻找的内容类似的功能,最好的方法是返回一个HTML文档,其中只包含一点JavaScript,可以关闭窗口:

<html>
    <body>
        <script>
            window.close();
        </script>
    </body>
</html>

window.close();

太简单了。我应该想到这一点,因为这甚至不是一个真正的MVC问题——只是一个html解决方案。不过,它可能需要启动一个停止的浏览器,调用窗口一秒钟,然后返回主页,造成一些混乱。事实上,想想看,既然呼叫来自电子邮件,而不是任何用户的浏览器,那么到底要打开哪个浏览器呢?如果没有要“返回”的浏览器会话,这会引发异常吗?我提出的问题是,当没有浏览器会话时,如何运行控制器功能-只有来自电子邮件的链接。如果方法不是ActionResult返回,而是void返回,我是否必须将某些内容返回到浏览器?电子邮件链接只会触发系统上的默认浏览器进行加载。没有例外,因为web应用程序没有在这里执行任何操作。单击链接将打开浏览器,浏览器从服务器请求URL,服务器将正常响应。它不知道也不关心请求是如何提出的,也不关心来自何处。最后,是的,您必须返回一个响应。这是无法避免的。返回void只会触发MVC发送一个空的响应体。谢谢,Chris。我习惯于用C/C++和.NET更直接地控制我的应用程序,这可能令人沮丧。这就像想把英语翻译成西班牙语,但不得不用法语写,然后让Visual Studio制作西班牙语——然后回去调整法语,以获得您真正想要的西班牙语翻译。当事情变得复杂和“美妙”时,千万不要让它变得简单和高效!"