Asp.Net MVC 5 仅从正文绑定参数
Asp.Net MVC 5 bind parameter exclusively from body
我想防止通过 url 查询字符串将敏感数据发布到 MVC 5 应用程序。
在 MVC 中有一个 DefaultModelBinder
。 DefaultModelBinder
在 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".
我想防止通过 url 查询字符串将敏感数据发布到 MVC 5 应用程序。
在 MVC 中有一个 DefaultModelBinder
。 DefaultModelBinder
在 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".