#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-evil2. По умолчанию, когда контроллер создается с помощью строительных лесов, все свойства модели или представления перечислены в методах создания и редактирования (применяются некоторые исключения). Таким образом, вы правы, список может получиться довольно длинным. Однако, основываясь на том, что я вижу из вашего кода выше, у вас есть только 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?