在输出格式化程序中使用FromQuery模型联编程序

时间:2018-11-16 08:51:15

标签: c# .net-core model-binding outputformatter

.net核心项目中有一个自定义OutputFormatter。在这里,我想在初始请求的查询字符串内使用一些信息。

在控制器内部,这可以通过FromQuery modelbinder很好地完成,为我提供了一个可以使用的对象。我也希望在我的输出格式化程序中有这个对象(模型)。

我能否以某种方式调用FromQuery作为实例,这样我甚至可以传入HttpContext或querystring来获取模型?

For Search_Config = 0 To 200
For Search_Library = 0 To 200
    j = Search_Library * 20
    If (Worksheets("Config Algemeen").Range("H2").offset(Search_Config, 0).Value = Worksheets("Library").Range("A2").offset(j, 0).Value) And Not (Worksheets("Config Algemeen").Range("H2").offset(Search_Config, 0).Value = "") Then
        For k = 1 To 200
            l = k * 2
            n = l - 1
            For m = 0 To 19
                MyChoices(m) = Worksheets("Library").Range("A2").offset(j + m, l).Value
            Next m
                With Worksheets("Config Algemeen").Range("H2").offset(Search_Config, k)
                    If Not Worksheets("Library").Cells(2 + j, 1 + n).Value = "" Then
                        .AddComment Worksheets("Library").Cells(2 + j, 1 + n).Value
                    Else
                        'Nothing
                    End If
                    If Worksheets("Library").Range("A2").offset(j, l).Value = "*VALUE*" Or Worksheets("Library").Range("A2").offset(j, l).Value = "" Then
                        'Nothing
                    Else
                        .Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                        Operator:=xlBetween, Formula1:=Join(MyChoices, ",")
                    End If
                End With
        Next k
    Else
        'Nothing
    End If
Next Search_Library
Next Search_Config

1 个答案:

答案 0 :(得分:1)

使用HttpContext.Items。在请求结束时,将清理放置在其中的对象。而且,您可以传递更多,默认值或更改的值(如果要更改绑定的对象,可能会很危险)

// GET api/values
[HttpGet]
public ActionResult Get([FromQuery] QData data)
{
    HttpContext.Items["data"] = data;
    .......
    return Ok(....);
}

您还可以为不同类型的请求设置多个格式化程序。

public class Formatter : OutputFormatter
{
    public override bool CanWriteResult(OutputFormatterCanWriteContext context)
    {
        return context.HttpContext.Items["data"] is QData;
    }
    public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
    {
        var incoming = context.HttpContext.Items["data"] as QData;
        .......
    }
}

您可以将任何其他对象放入Items并在格式化程序中使用该对象的方式相同。对于其他对象,由于它依赖于特定的结构,因此可以是更通用,更稳定的解决方案。