Asp.Net MVC 5 仅从正文绑定参数

Asp.Net MVC 5 bind parameter exclusively from body

我想防止通过 url 查询字符串将敏感数据发布到 MVC 5 应用程序。

在 MVC 中有一个 DefaultModelBinderDefaultModelBinder 在 url 查询字符串、正文和路由中查找 ActionMethod 参数。但我的目标是仅从正文绑定参数,而不是从路由或查询字符串绑定 not

在Asp.NetWebApi中就有这样一个概念。属性 [FromBody] 将完成这项工作:http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

有适合MVC的东西吗?

我找到了 System.Web.ModelBinding.FormAttribute (https://msdn.microsoft.com/en-us/library/system.web.modelbinding.formattribute(v=vs.110).aspx)。但是,如果我装饰参数,它对模型绑定没有影响。

那为什么不使用表单呢? 在提交您 post 表单数据时

默认情况下,活页夹在四个地方查找数据:表单数据、路由数据、查询字符串和任何上传的文件。

可以将绑定限制为单一数据源。为此,您应该调用 UpdateModel 方法,将 FormValueProvider 对象作为第二个参数传递(IValueProvider[ 的实现=29=]).

public ActionResult Products()
{
    IList<Products> products = new List<Products>();
    UpdateModel(products, new FormValueProvider(ControllerContext));
    return View(products);
}

完整的对象列表是(它们都接收 ControllerContext 作为构造函数参数):

  • FormValueProvider: 在正文中搜索数据(Request.Form)
  • RouteDataValueProvider: 在路由中搜索数据(RouteData.Value)
  • QueryStringValueProvider:在查询字符串中搜索数据(Request.QueryString)
  • HttpFileCollectionValueProvider: 搜索上传的文件(Request.Files)

另一种方法:创建一个使用 FormValueProvider 自定义模型联编程序 。这样做的好处是不用修改action方法

示例:

[ModelBinder(typeof(PersonBinder))]
public class Person
{
    [DisplayName("Social Security Number")]
    public int SSN { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string ShouldNotBind { get; set; }
}

public class PersonBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        bindingContext.ValueProvider = new FormValueProvider(controllerContext);
        Person model = (Person)bindingContext.Model ?? new Person();
        model.SSN = Convert.ToInt16(GetValue(bindingContext, "SSN"));
        return model;
    }

    private string GetValue(ModelBindingContext context, string name)
    {
        ValueProviderResult result = context.ValueProvider.GetValue(name);
        if (result == null || result.AttemptedValue == "")
        {
            return "<Not Specified>";
        }
        return result.AttemptedValue;
    }
}

以及你的操作方法:

[HttpPost]
public ActionResult Person(Person person)
{
    return View(person);
}

即使您 post 使用查询字符串,ShouldNotBind 属性 也会显示为 "null".