Asp.Net MVC 5 привязывает параметр исключительно из тела
7224 просмотра
3 ответа
Я хочу запретить публикацию конфиденциальных данных через строку запроса URL в приложении MVC 5.
В MVC есть DefaultModelBinder
. В DefaultModelBinder
ищет ActionMethod
параметров в строке запроса URL - адрес, тело и маршрут. Но моя цель - привязать параметры исключительно из тела, а не из маршрута или строки запроса.
В Asp.Net WebApi есть такая концепция. Атрибут [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 ). Тем не менее, если я украсить параметр, это не влияет на привязку модели.
Ответы (3)
6 плюса
По умолчанию связыватель ищет данные в четырех местах: данные формы, данные маршрута, строка запроса и любые загруженные файлы.
Можно ограничить привязку к одному источнику данных. Для этого следует вызвать метод UpdateModel, передав в качестве второго параметра объект FormValueProvider (реализация IValueProvider ).
public ActionResult Products()
{
IList<Products> products = new List<Products>();
UpdateModel(products, new FormValueProvider(ControllerContext));
return View(products);
}
Полный список объектов (все они получают ControllerContext в качестве параметра contructor):
- FormValueProvider : поиск данных в теле (Request.Form)
- RouteDataValueProvider : поиск данных в маршруте (RouteData.Value)
- QueryStringValueProvider : поиск данных в строке запроса (Request.QueryString)
- HttpFileCollectionValueProvider : поиск загруженных файлов (Request.Files)
5 плюса
Другой способ: создать пользовательский механизм связывания моделей, который использует FormValueProvider . Преимущество этого в том, что вам не нужно изменять метод действия.
Пример:
[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);
}
Даже если вы публикуете строку запроса, ShouldNotBind
свойство будет отображаться как «ноль».
0 плюса
Почему бы тогда не использовать форму? При отправке вы размещаете данные формы
Автор: Piotr Dory Размещён: 14.08.2015 02:24Вопросы из категории :
- asp.net Контрольный список для проверки подлинности Windows IIS 6 / ASP.NET?
- asp.net Валидация клиентской стороны ASP.Net
- asp.net .NET - получить протокол, хост и порт
- asp.net Как получить полный URL страницы, на которой я нахожусь в C #
- asp.net Как заставить Visual Studio заново создать файлы .designer для файлов aspx / ascx?
- asp.net-mvc Каков наилучший способ проверки полей с использованием ASP.NET MVC?
- asp.net-mvc От клиента было обнаружено потенциально опасное значение Request.Form
- asp.net-mvc Проверка на стороне клиента ASP.NET MVC
- asp.net-mvc ASP.NET MVC - передача параметров в контроллер
- asp.net-mvc Разница между ViewData и TempData?
- asp.net-mvc-5 Как получить текущего пользователя и как использовать класс User в MVC5?
- asp.net-mvc-5 Использование HandleErrorAttribute в приложении ASP.NET MVC
- asp.net-mvc-5 ASP.NET MVC5 / IIS Express не может отладить - код не работает
- asp.net-mvc-5 Как создать уникальное поле в модели MVC?
- asp.net-mvc-5 Как изменить тип идентификатора в Microsoft.AspNet.Identity.EntityFramework.IdentityUser
- model-binding Связывание HttpPostedFileBase с использованием Ajax.BeginForm
- model-binding ModelMetaData, атрибуты пользовательского класса и неописуемый вопрос
- model-binding Is there a reason why the default modelbinder doesn't bind to fields?
- model-binding Как заставить модель ASP.Net MVC связывать входящую дату как UTC?
- model-binding Ошибка рекурсивной привязки модели в ASP.NET MVC