Вопрос:

Asp.Net MVC 5 привязывает параметр исключительно из тела

asp.net asp.net-mvc asp.net-mvc-5 model-binding

7224 просмотра

3 ответа

418 Репутация автора

Я хочу запретить публикацию конфиденциальных данных через строку запроса 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 ). Тем не менее, если я украсить параметр, это не влияет на привязку модели.

Автор: Dennis K Источник Размещён: 14.08.2015 02:19

Ответы (3)


0 плюса

251 Репутация автора

Почему бы тогда не использовать форму? При отправке вы размещаете данные формы

Автор: Piotr Dory Размещён: 14.08.2015 02:24

6 плюса

1541 Репутация автора

Решение

По умолчанию связыватель ищет данные в четырех местах: данные формы, данные маршрута, строка запроса и любые загруженные файлы.

Можно ограничить привязку к одному источнику данных. Для этого следует вызвать метод 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)
Автор: Rafael Companhoni Размещён: 14.08.2015 02:49

5 плюса

11475 Репутация автора

Другой способ: создать пользовательский механизм связывания моделей, который использует 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свойство будет отображаться как «ноль».

Автор: Maria Ines Parnisari Размещён: 14.08.2015 03:00
Вопросы из категории :
32x32