【问题标题】:MVC HttpGet AttributeMVC HttpGet 属性
【发布时间】:2015-11-18 23:40:28
【问题描述】:

MVC 新手在这里找不到足够简单的解释。

我刚刚开始使用 MVC 构建一个相当大的应用程序。

在我使用的控制器中,大多数ActionResults 都附加了[HttpGet] 属性。所以我正在构建该代码,我自己构建了两个ActionResults,但关闭了[HttpGet] 属性。

这些调用数据库层,然后将结果返回给视图。他们工作正常。当我注意到他们没有[HttpGet] 时,我添加了它们,然后呼叫停止工作。我不知道为什么,或者他们必须在那里的押韵和理由。

这是我从视图中拨打的电话:

function getExcelExport() {
var activePane = $('div.tab-pane.active');

var agencyCompany = $(activePane).find('#Agency_AgencyId').val();
if (!$(activePane).find('#form0').valid()) { return false; }
var month = $(activePane).find('#CommissionMonth').val();
var year = $(activePane).find('#CommissionYear').val();

window.location = 'AgencyManagement/GetCommissionsExcel?agencyID=' + agencyCompany + '&month=' + month + '&year=' + year;
};

这是控制器中的操作:

        public ActionResult GetCommissionsExcel(string agencyid, string month, string year)
    {
        try
        {
            var as400rep = new iSeriesRepository(new iSeriesContext());
            var results = as400rep.GetCommissionExcel(agencyid, month, year);

            string xml = String.Empty;
            XmlDocument xmlDoc = new XmlDocument();

            XmlSerializer xmlSerializer = new XmlSerializer(results.GetType());

            using (System.IO.MemoryStream xmlStream = new System.IO.MemoryStream())
            {
                xmlSerializer.Serialize(xmlStream, results);
                xmlStream.Position = 0;
                xmlDoc.Load(xmlStream);
                xml = xmlDoc.InnerXml;
            }

            var fName = string.Format("CommissionsExcelExport-{0}", DateTime.Now.ToString("s"));
            fName = fName + ".xls";

            byte[] fileContents = System.Text.Encoding.UTF8.GetBytes(xml);

            return File(fileContents, "application/vnd.ms-excel", fName);
            }
        catch (Exception ex)
        {
            Log.Error(ex.Message, ex.InnerException);
            throw;
        }
    }

对此有简单的解释吗?

【问题讨论】:

  • 您是如何呼吁采取行动的?如果是 Ajax,您是否将类型指定为 GET 或 POST

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

当您添加 [HttpGet] 并且调用“停止”工作时,原因是您将使用不同的 HTTP 动词调用该方法,例如POST.

在方法上应用 Http 动词属性意味着,to restrict an action method so that the method handles only HTTP GET requests.

当您不使用 http 动词属性时,这一切都起作用的原因是,该操作方法随后可通过所有 Http 动词使用。

使用[HttpPost] 标记该操作方法,它将起作用。

[HttpPost]
public ActionResult Action(int id)
{
}

GETPOST 可以使用相同的方法名称,但该方法需要不同的签名(重载)。

[HttpGet]
public ActionResult Action() { }

[HttpPost]
public ActionResult Action(int id) { }

这通常用于 PRG 模式(POST、重定向、GET)。您可以进一步了解here

【讨论】:

  • 好的,试过了,效果很好。所以它在没有属性的情况下工作的原因是因为只有一个具有该名称的操作对吗?如果有两个,一个 GET 操作和一个 POST 操作,我必须指定,这是有道理的。
  • 我将添加一个带有 GET 和 POST 的示例,如果您没有放置 http 动词属性,那么该方法可以通过所有动词、POST、GET、PUT 等访问。
  • 很好的解释 Jamie,对不起,它必须达到 ELI5 级别:),谢谢!
  • @TrevorGoodchild 没关系!每个人都必须从某个地方开始。
【解决方案2】:

[HttpGet] 将 Action 标记为仅适用于 GET 请求的应用程序 -

考虑以下几点:

public ActionResult DoSomething() { }

如果您要 GET 到 /DoSomething 或 POST /DoSomething - 将调用该操作。

指定:

[HttpGet]
public ActionResult DoSomething() { }

确保只有在请求是 GET 时才会调用它

【讨论】:

  • 好的,所以在一种情况下,我会得到一份月份列表。调用来自这样的视图:window.location = 'Agency/GetCommissions?agencyID=' + agentCompany + '&month=' + month + '&year=' + year;该调用传到数据层,该层调用数据库、返回列表并填充视图。所以这是一个正确的?如果我将 [HttpGet] 属性放在操作上,它将不会显示。你能解释一下为什么吗?并感谢您的回复。
  • 您可以编辑您的问题并显示更多代码吗?特别是调用你的 mvc 控制器的 js
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多