Массив строк ядра MVC в атрибут Bind

#c# #asp.net-mvc #asp.net-core-mvc

#c# #asp.net-mvc #asp.net-core-mvc

Вопрос:

Итак, у меня есть контроллер, где, когда я хочу опубликовать модель, я хочу привязать только определенные поля. Я хочу извлечь массив параметров из тега [Bind], поскольку он может стать очень длинным. Как мне этого добиться? В настоящее время я получаю «Аргумент атрибута должен быть постоянным выражением, выражением typeof или выражением создания массива типа параметра атрибута», когда я пытаюсь использовать приведенный ниже код.

 protected static readonly string[] BINDABLE = { "PartID", "InternalPartNum",  "ManufacturerPartNum" };

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([Bind(BINDABLE)]PartModel model)
{
    if (!ModelState.IsValid)
    {
        ViewData["ObjectName"] = OBJECT_NAME;
        return BadRequest(ModelState);
    }
    _partDAO.Insert(model);
    return RedirectToAction(nameof(Index));
}
  

Комментарии:

1. Просто вы не можете этого сделать, что является важной частью причины, по которой Bind это такой антишаблон. Лучшее решение — вообще не использовать его. Вместо этого используйте модель представления. Смотрите: cpratt.co/bind-is-evil

2. По умолчанию, когда контроллер создается с помощью строительных лесов, все свойства модели или представления перечислены в методах создания и редактирования (применяются некоторые исключения). Таким образом, вы правы, список может получиться довольно длинным. Однако, основываясь на том, что я вижу из вашего кода выше, у вас есть только 3 свойства, которые вы хотите привязать. Мне это не кажется таким уж длинным. Итак, я спрашиваю, понимаете ли вы, что атрибут bind применяется только к параметрам, которые вы хотите опубликовать в своем хранилище данных.

3. Итак, если ваша модель или модель представления имеет 15 различных параметров, но вы хотите «обновить» только три из них, вам не нужен весь список — только три. Это полезно?

4. В качестве альтернативы вы можете изучить привязку пользовательской модели с помощью ModelBinder. Это позволяет обойти атрибут BInd по умолчанию и позволяет вам создать свой собственный — ваша пользовательская модель binder будет принимать HTTP-запрос, и вы можете создать код для его разбора в любом случае, который вы хотите. Но это небольшая работа. Придерживайтесь того, что предложил Крис П.

5. У меня есть несколько моделей, для создания / редактирования которых потребуется более 15 полей. Я не хочу изменять их при создании, редактировании и т.д. после публикации. Я хочу, чтобы они были в единственном массиве, который можно было бы просто использовать повторно, и меньше шансов, что что-то будет пропущено.

Ответ №1:

Для Bind того, чтобы он мог принимать строку, вы могли бы попробовать workaroud ниже:

 protected const string BINDABLE = "PartID,InternalPartNum" ;

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([Bind(BINDABLE)]PartModel model)
{
    return Ok();
}
  

Комментарии:

1. Это больше не работает в ядре MVC. Каждое поле должно быть отдельной строкой.

2. @JarodD Какая у вас версия .net core?