【问题标题】:How to stop ASP.NET from injecting an Object in a GET Action method如何阻止 ASP.NET 在 GET 操作方法中注入对象
【发布时间】:2019-11-13 02:00:28
【问题描述】:

我有一个用参数调用的动作方法,一个参数是int 动作方法的另一个参数是Object

当我检查操作方法时,我发现Object 参数不完全为空, 此对象的 UserId 属性设置为一个值,e.g. model.UserId = 82

如何阻止 ASP.NET 创建对象? 我可以通过将 userId 原始变量重命名为 paramUserId 来解决这个问题, 但并不理想。

下面是动作方法:

[HttpGet]
public async Task<IActionResult> Select(int userId = 0, ObjectModel model = null)

网址:

https://localhost:5001/[Area]/[Controller]/Select?userId=82

对象模型:

   public class ObjectModel
   {
       public int Id { get; set; }
       public int UserId { get; set; }
   }

【问题讨论】:

  • 这个对象模型是干什么用的?
  • @John 其他一些操作方法使用对象重定向到此操作方法。我希望模型为空的所有其他调用;但它不是这样工作的; .NET 正在注入一个对象。
  • 我已经有一段时间没有涉足 .NET MVC 了,但是您认为注入的模型实际上是视图模型吗?换句话说,它是否被自动创建以在方法的视图中使用,以便(可能)将数据显示到屏幕上?
  • 您可以尝试将其明确声明为[FromBody] 吗?如果它有效,我会添加一个答案。
  • @John 状态码:415;不支持的媒体类型。

标签: c# asp.net-core


【解决方案1】:

get请求中的复杂模型是以querystring的格式传递的,所以当你调用https://localhost:5001/[Area]/[Controller]/Select?userId=82时,默认的模型绑定会自动匹配参数进行值绑定(不区分大小写)。如果不想要更改int类型参数名称,可以尝试自定义模型绑定,根据请求中UserId的大小写来绑定模型,如下:

MyCustomerModelBinder

public class MyCustomerModelBinder:IModelBinder
{
    public  Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)

        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var modelResult = new ObjectModel();

        //Get the Query in the request 
        var queryResult =new Dictionary<string, string>();
        var query = bindingContext.HttpContext.Request.Query;
        foreach (var k in query.Keys)
        {
            StringValues v = string.Empty;
            var flag = query.TryGetValue(k, out v);
            if (flag)
            {
                queryResult.Add(k, v);
            }
        }

        // Bind model when UserId exists in the Query
        if (queryResult.ContainsKey("UserId"))
        {
            modelResult.Id =Convert.ToInt32(bindingContext.ValueProvider.GetValue("id").FirstValue);
            modelResult.UserId =Convert.ToInt32(bindingContext.ValueProvider.GetValue("UserId").FirstValue);
            bindingContext.Result = ModelBindingResult.Success(modelResult);
            return Task.CompletedTask;
        }

        modelResult = null;
        bindingContext.Result = ModelBindingResult.Success(modelResult);
        return Task.CompletedTask;
    }
}

动作

[HttpGet]
    public async Task<IActionResult> Select(int userId = 0, [ModelBinder(BinderType = typeof(MyCustomerModelBinder))] ObjectModel model = null)

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2019-07-08
    • 2019-01-27
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多