powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Несколько форм на одной странице [MVC/Razor] часть 2
1 сообщений из 1, страница 1 из 1
Несколько форм на одной странице [MVC/Razor] часть 2
    #38624328
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предложу ещё один вариант, как обеспечить генерацию уникальных ID нескольких форм на одной странице минимальными усилиями, используя возможности фреймворка ASP.NET MVC.

Модель:

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class MyCustomViewModel
    {
        public int Id { get; set; }
        public DateTimeOffset Created { get; set; }
        public string Title { get; set; }
        public int SomeNumber { get; set; }
    }



Вью:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
@model MyCustomViewModel
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "Custom[" + Model.Id + "]";
}

@using (Html.BeginForm())
{
    ........
}



Связывание данных:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum 
     | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
    public class RoutePrefixModelBindAttribute : CustomModelBinderAttribute
    {
        public string Prefix { get; set; }

        public string Parameter { get; set; }

        public RoutePrefixModelBindAttribute(string prefix, string parameter)
        {
            Prefix = prefix;
            Parameter = parameter;
        }

        public override IModelBinder GetBinder()
        {
            return new RoutePrefixModelBinder(Prefix, Parameter);
        }
    }

    public class RoutePrefixModelBinder : DefaultModelBinder
    {
        private readonly string _prefix;
        private readonly string _parameter;

        public RoutePrefixModelBinder(string prefix, string parameter)
        {
            _prefix = prefix;
            _parameter = parameter;
        }

        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var paramValue = bindingContext.ValueProvider.GetValue(_parameter).RawValue.ToString();
            bindingContext.ModelName = _prefix + "[" + paramValue + "]";
            return base.BindModel(controllerContext, bindingContext);
        }
    }



Контроллер:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        [Route("some/{id}/edit"), HttpPost]
        public ActionResult Edit(int id, [RoutePrefixModelBind("Custom", "id")] MyCustomViewModel model)
        {
            if (ModelState.IsValid)
            {
               ...
            }
            return PartialView(model);
        }



Суть решения:

Вместо плясок с бубном, выделывая уникальные ID вручную, позволим фреймворку заниматься этим самому. Для этого просто добавим свой динамический префикс, зависимый от данных (допустим, ID сущности). Чтобы данные с префиксом вязались к модели, добавим свой связыватель, расширив дефолтный биндер.

Плюсы:

Решение отлично работает. Решение распространяется на любые шаблонные редакторы, в том числе кастомные хелперы. Решение ни с чем не конфликтует.

Приведённый выше код является крайне упрощённым, без проверок и расширений. Возможно его доработать, чтобы он принимал несколько параметров. Шаблон генерации префикса можно изменить или передавать через атрибуты. Тут уже по вкусу.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Несколько форм на одной странице [MVC/Razor] часть 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]