powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Не устанавливается свойство ViewModel
9 сообщений из 9, страница 1 из 1
Не устанавливается свойство ViewModel
    #39762247
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, подскажите по ситуации кто может:
есть View, на которой есть пару скалярных свойств и одно свойство-коллекция. (Главная форма)
Код: html
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
@model ItModels.ItClaim
@inject ItAccounting.Interfaces.IDepartment  departmentData

<link rel="stylesheet" href="~/css/EqClaim/Index.css"/>

<form asp-action="CreateAndSave" method="post">
    <h4>Создание новой заявки на закупку оборудования</h4>

    <select id="DepartmentID" name="DepartmentID" asp-for="@Model.DepartmentSelected" class="form-control restricted_width">
        <option>Выберите департамент</option>
        @foreach (var item in await departmentData.Getdepartments())
        {
            var isSelected = Model.DepartmentSelected == null ? false :
              item.ID == Model.DepartmentSelected ? true : false;

            <option value="@item.ID" selected="@isSelected">@item.Name</option>
        }
    </select><br/>


    <select id="PersonID" name="PersonID" asp-for="@Model.PersonSelected" class="form-control restricted_width">

        @if (@Model.PersonSelected != null)
        {
            @foreach (var item in await departmentData.GetDepartmentPeople(@Model.DepartmentSelected))
            {
                var isSelected = Model.PersonSelected == null ? false :
                  item.ID == Model.PersonSelected ? true : false;
                <option value="@item.ID" selected="@isSelected">@item.ShortName</option>
            }
        }
        else
        {
            <option>Выберите ответственного</option>
        }

    </select><br/>

    <label>Рабочее место</label>

    <input asp-for="@Model.WorkPlace" type="text" id="WorkPlace" /><br/>


            <table id="tblEqups" class="table">
                <thead>
                    <tr>
                        <th scope="col">Модель</th>
                        <th scope="col">Цена</th>
                        <th scope="col">Количество</th>
                    </tr>
                </thead>

                <tbody>
                    @foreach (ItModels.ClainmEquipment r in @Model.EquipmentList)
                    {
                        <tr class="EqRowTemplate">
                            <td class="cModel">@r.Model</td>
                            <td class="cPrice">@r.BuyPriceDescr</td>
                            <td class="cCnt">@r.cnt</td>

                            <td>
                                <a class="btn btn-warning" asp-action="Edit" asp-route-id="@r.ID">Редактировать</a>
                            </td>

                            <td>
                                <a class="btn btn-danger" asp-action="Delete" asp-route-id="@r.ID">Удалить</a>
                            </td>

                        </tr>
                    }
                </tbody>

            </table><br/>
            <input type="submit" value="Добавить оборудование" class="btn btn-primary"/><br/>

        </form>
            <div id="fileUpload" class="form-group">
                <form asp-action="AddFiles" asp-controller="EqClaim" method="post" enctype="multipart/form-data">
                    <input type="file" name="uploadedFiles" class="form-control-file"  multiple />

                    <input type="submit" value="Загрузить файлы" class="btn btn-secondary" />

                </form>
            </div>


    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
        <script async src="~/js/EqClaims/Index.js"></script>}



Для этой View есть ViewModel
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
    public class ItClaim
    {

        /// <summary>
        /// Номер заявки
        /// </summary       
        public int ID { get; set; } 

        /// <summary>
        /// Список оборудования, которое необходимо закупить
        /// </summary>
        public ICollection<ClainmEquipment> EquipmentList { get; set; }

        [NotMapped]
        /// <summary>
        /// Индекс, по которому выбирается департамент
        /// </summary>
        public string DepartmentSelected { get; set; }

        [NotMapped]
        /// <summary>
        /// Индекс, по которому выбирается ответственный за заявку
        /// </summary>
        public string PersonSelected { get; set; }

        /// <summary>
        ///Рабочее место  
        /// </summary>
        [MaxLength(150)]
        public string WorkPlace { get; set; }

        /// <summary>
        ///  Связанные с заявкой файлы
        /// </summary>
        public IList<DocFile> DocFiles { get; set; }

        /// <summary>
        /// Оборудование, которое добавляем в список
        /// </summary>
        public ClainmEquipment NewEquip { get; set; }

        [Required]
        /// <summary>
        /// Ответственный за заявку
        /// </summary>
        public Person person { get; set; }

        /// <summary>
        /// Договор, к которому принадлежит заявка
        /// </summary>
        public Contract Contract { get; set; }

        public ItClaim()
        {
            EquipmentList = new List<ClainmEquipment>();
            DocFiles = new List<DocFile>();
        }
    }



На View есть кнопка, по которой я могу перейти на новую форму добавления элементов (подчиненная форма) в список для главной формы, ввести параметры нового добавляемого элемента и вернуться на главную форму.
Код: html
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
@model ItModels.ClainmEquipment
@inject ItAccounting.Interfaces.IspravHolder  spravHolder


<div class="row">
    <div class="col-md-4">

        <form asp-action="Create">
            <div class="validation" asp-validation-summary="ModelOnly"></div>

            <label>Тип оборудования</label>

       
            <select id="GroupSelectedID" class="form-control">

                <option>Выберите тип оборудования</option>
                @foreach (var item in spravHolder.GetGroups)
                {
                    <option value="@item.ID">@item.Name</option>
                }
            </select>


            <label>Оборудование</label>

            <select asp-for="@Model.EqModelId" id="ModelSelectedID" class="form-control">
                <option>Выберите оборудование</option>
                @foreach (var item in spravHolder.GetEquipments)
                {
                    <option value="@item.ID">@item.Model</option>
                }
            </select><br/>

            <label>Цена оборудования</label>

            <input asp-for="@Model.BuyPrice" type="text" id="Price" />



            <label>Кол-во оборудования</label>

            <input asp-for="@Model.cnt" type="text" id="Cnt" />



            <div class="form-group">
                <input type="submit" value="Добавить в заявку" class="btn btn-default" />
            </div>
        </form>

    </div>
</div>

<div>
    <a asp-action="return">Вернуться</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    <script async src="~/js/EqClaims/Create.js"></script>

}



Код контроллера:
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
  [Authorize]
    /// <summary>
    /// Контроллер для обработки заявок на покупку оборудования
    /// </summary>
    public class EqClaimController:Controller
    {
        #region  ReadOnly Props

        private  IServiceProvider Provider { get;  }
        private ApplicationDbContext context => Provider.GetService<ApplicationDbContext>();
        #endregion

        public EqClaimController(IServiceProvider serviceProvider)
        {
            Provider = serviceProvider;
        }

        public async Task<IActionResult> Index(ItClaim model) 
        {
            return View(model);
        }


        /// <summary>
        /// Подтверждение добавления оборудования в список покупки и возврат к списку покупаемого оборудования на главную форму
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ActionName("Create")]
        public async Task<IActionResult> CreateConfirm(ClainmEquipment model)
        {
            
           var CookieValue = HttpContext.Session.GetString("ItClaimShort");

           var spravHolder=  Provider.GetService<IspravHolder>();
            model.Model = spravHolder.GetModel(model.EqModelId);

            ItClaim itClaimVM = new ItClaim();
            itClaimVM.EquipmentList.Add(model);

            if (!(string.IsNullOrEmpty(CookieValue)))
            {
                ItClaimShort Jmodel = JsonConvert.DeserializeObject<ItClaimShort>(CookieValue);
                itClaimVM.DepartmentSelected = Jmodel.DepartmentSelected;
                itClaimVM.PersonSelected = Jmodel.PersonSelected;
                itClaimVM.WorkPlace = Jmodel.WorkPlace;
            }

            return View("Index", itClaimVM);
        }
  
        /// <summary>
        /// Переходим на форму добавления нового оборудования из главной формы
        /// </summary>
        /// <param name="itClaim"></param>
        /// <param name="department"></param>
        /// <returns></returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ActionName("CreateAndSave")]
        public async Task<IActionResult> CreateAndSave( ItClaim itClaim,
            [FromServices] IDepartment department)
        {


            var DepartamentID = HttpContext.Request.Form["DepartmentID"].ToString();
            var PersonID = HttpContext.Request.Form["PersonID"].ToString();
            var WorkPlace = HttpContext.Request.Form["WorkPlace"].ToString();

            string serialisedItClaimShort;

            var value = HttpContext.Session.GetString("ItClaimShort");

            ItClaimShort itClaimShort = new ItClaimShort();
            itClaimShort.PersonSelected = PersonID;
            itClaimShort.WorkPlace = WorkPlace;
            itClaimShort.DepartmentSelected = DepartamentID;

            serialisedItClaimShort = JsonConvert.SerializeObject(itClaimShort);

            HttpContext.Session.SetString("ItClaimShort", serialisedItClaimShort);

            return View("Create");
        }
    }



Когда я делаю следующую последовательность действий CreateAndSave=>Добавляю новый элемент=>CreateConfirm (Возвращаюсь на главную форму со списком)=>CreateAndSave возникает следующая проблема

После того как я добавил новый элемент из подчиненной формы и возвращаюсь на главную, на главной форме в списке этот элемент появился. Однако, когда я хочу добавить еще один и опять вызываю метод CreateAndSave, то в параметрах метода приходит пустая Viewmodel, то есть EquipmentList пустой, и я никак не могу считать список уже имеющихся элементов на главной форме.
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762248
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
У тебя разве корзина покупок? Зачем в сессию? Сохраняй сразу в базу во второй.
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762255
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
чтобы этот список хранился для конкретного пользователя нужно пользователя приложения расширить этим функционалом
что-то типа
Код: 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.
  /// <summary>
    /// Пользователь приложения
    /// </summary>
    public class ApplicationUser : IdentityUser
    {

        #region Public Properties

        /// <summary>
        /// The users first name
        /// </summary>
        public string FirstName { get; set; }

        /// <summary>
        /// The users last name
        /// </summary>
        public string LastName { get; set; }

        public ICollection<ClainmEquipment> EquipmentList { get; set; }
      
        #endregion


    }


?
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762257
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Ничего не понял.
Давай от печки.
Дай таблиц модели в базе.
Коллекция разве для каждого своя?
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Код: c#
1.
ApplicationUser

он чисто для аутентификации.
Ты что пишешь?
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762263
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
для каждого пользователя своя коллекция. Поэтому нужно привязать коллекцию к конкретному пользователю.
Или скорее всего нужно дополнить модели типа ItClaim свойством ApplicationUser.
В базе таблицы представлены просто
Код: c#
1.
public DbSet<ItClaim> ItClaims { get; set; }


В принципе меня бы и устроило, если бы ViewModel нормально запомнила все данные и только в самом конце были бы посланы все изменения для сохранения в базу данных.
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762264
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123vb_sub
Код: c#
1.
ApplicationUser

он чисто для аутентификации.
Ты что пишешь?

аутентификация нужна. Пишу форму составления заявки- на корзину в принципе похоже.
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762275
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Нет.
Аутентификация отдельно от бизнес логики.
Она может быть в другой базе.
...
Рейтинг: 0 / 0
Не устанавливается свойство ViewModel
    #39762278
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет.
Сделай отдельно свои заявки. Потом добавишь вход и пароли.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Не устанавливается свойство ViewModel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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