Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Не устанавливается свойство ViewModel / 9 сообщений из 9, страница 1 из 1
21.01.2019, 10:39
    #39762247
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не устанавливается свойство ViewModel
Всем привет, подскажите по ситуации кто может:
есть 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
21.01.2019, 10:50
    #39762248
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не устанавливается свойство ViewModel
vb_sub,
У тебя разве корзина покупок? Зачем в сессию? Сохраняй сразу в базу во второй.
...
Рейтинг: 0 / 0
21.01.2019, 11:06
    #39762255
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не устанавливается свойство ViewModel
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
21.01.2019, 11:11
    #39762257
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не устанавливается свойство ViewModel
vb_sub,
Ничего не понял.
Давай от печки.
Дай таблиц модели в базе.
Коллекция разве для каждого своя?
...
Рейтинг: 0 / 0
21.01.2019, 11:12
    #39762258
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не устанавливается свойство ViewModel
vb_sub
Код: c#
1.
ApplicationUser

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


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

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

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


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