Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / LIst form View to Controller / 10 сообщений из 10, страница 1 из 1
17.10.2015, 20:53
    #39079172
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
public class Customer
{
public String Name { get; set; }
public String Surname { get; set;}
public List <Address> { get; set;}
}


Из вью в Post Create Controller возвращается Address = 0

Подскажите пожалуйста в чем может быть причина.
...
Рейтинг: 0 / 0
17.10.2015, 21:00
    #39079174
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Артем GПодскажите пожалуйста в чем может быть причина.Вы где-то допустили ошибку, или ряд ошибок. Продемонстрируйте что-ли код представления.
...
Рейтинг: 0 / 0
17.10.2015, 21:16
    #39079178
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
skyANAАртем GПодскажите пожалуйста в чем может быть причина.Вы где-то допустили ошибку, или ряд ошибок. Продемонстрируйте что-ли код представления.

хм, во вью точно коллекция на месте. пробегаю циклом по ней.

А бинд(инклуд) обязателен в POST контроллерах?
...
Рейтинг: 0 / 0
17.10.2015, 23:27
    #39079209
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Наверное лучше написать саму задачу.

В SQL 2 таблицы (Tasks & Environments) и связь много ко многим.
При создании Task на html вывожу Environments ввиде чекбоксов

В модель Tasks добавляю public IEnumerable(Of EnvironmentAvailableModel) EnvironmentsAvailable

Во вью она передается номрально и чекбоксы я вижу.
В POST контроллер приходит EnvironmentsAvailable = 0 , в ModelState вообще EnvironmentsAvailable отсутствует, иногда присутствует

Использую Automapper. Пробывал и без него.

4-5 дней уже пытаюсь получить результат ( гугл ни фига не помогает...
...
Рейтинг: 0 / 0
18.10.2015, 01:40
    #39079233
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Артем G,

выкладывай код вьюхи
...
Рейтинг: 0 / 0
18.10.2015, 15:01
    #39079347
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Вот база данных



Вот модель

Код: vbnet
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.
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema

Public Class TaskCreateViewModel
    Public Sub New()
        Environments = New HashSet(Of EnvironmentModel)()
        EnvironmentsAvailable = New HashSet(Of EnvironmentAvailableModel)()
    End Sub
    Public Property Id As Long
    Public Property MilestoneId As Long
    <Required>
    <StringLength(250)>
    Public Property Title As String
    <Column(TypeName:="ntext")>
    Public Property Description As String
    Public Property WD As Byte
    Public Property SLA As Byte
    <DataType(DataType.Date)>
    <DisplayFormat(ApplyFormatInEditMode:=True, DataFormatString:="{0:yyyy-MM-dd}")>
    <DisplayName("Plannned end date")>
    <Required(ErrorMessage:="Plannned End Date can't be empty")>
    Public Property PlannedEndDate As Date
    <DataType(DataType.Time)>
    <DisplayFormat(ApplyFormatInEditMode:=True, DataFormatString:="{0:hh\:mm}")>
    <DisplayName("Plannned end time")>
    <Required(ErrorMessage:="Plannned End Time can't be empty")>
    Public Property PlannedEndTime As TimeSpan
    Public Overridable Property Environments As ICollection(Of EnvironmentModel)
    Public Overridable Property EnvironmentsAvailable As IEnumerable(Of EnvironmentAvailableModel)  [color=red]< ---- Вот то что хочу увидеть в контроллере POST[/color]
End Class

Public Class EnvironmentModel
    Public Property Id As Byte
    Public Property Name As String
End Class

Public Class EnvironmentAvailableModel
    Public Property Id As Byte
    Public Property Name As String
    Public Property IsSelected As Boolean
End Class



Вот контроллер Get

Код: vbnet
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.
        Function Create() As ActionResult

            Try

                Mapper.CreateMap(Of Task, TaskCreateViewModel)().ForMember(Function(dest) dest.EnvironmentsAvailable, Sub(opt) opt.Ignore())

                Mapper.CreateMap(Of Environment, EnvironmentAvailableModel)().ForMember(Function(dest) dest.IsSelected, Sub(opt) opt.Ignore())

                Dim sourceEnvironmentsAvailable As IEnumerable(Of Environment) = db.Environments.ToList

                Dim modelEnvironmentsAvailable As IEnumerable(Of EnvironmentAvailableModel) = Mapper.Map(Of IEnumerable(Of Environment), IList(Of EnvironmentAvailableModel))(sourceEnvironmentsAvailable)

                Dim model As TaskCreateViewModel = Mapper.Map(Of Task, TaskCreateViewModel)(New Task)
                model.EnvironmentsAvailable = modelEnvironmentsAvailable
                
                ViewBag.MilestoneId = New SelectList(db.Milestones, "Id", "Title")
                ViewBag.Id = New SelectList(db.PreviousTasks, "Id", "Id")

                Return View(model)

            Catch ex As Exception
                Return View("Error", New HandleErrorInfo(ex, "Tasks", "Create GET"))
            End Try

        End Function



Вот вьюха

Код: 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.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
@ModelType TaskCreateViewModel 
@Code
    ViewData("Title") = "Create"
    Layout = "~/Views/Shared/_Layout.vbhtml"
End Code

<h2>Create</h2>

@Using (Html.BeginForm())
    @Html.AntiForgeryToken()

    @<div class="form-horizontal">
        <h4>Task</h4>
        <hr />
        @Html.ValidationSummary(True, "", New With {.class = "text-danger"})
        <div class="form-group">
            @Html.LabelFor(Function(model) model.MilestoneId, "MilestoneId", htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.DropDownList("MilestoneId", Nothing, htmlAttributes:=New With {.class = "form-control"})
                @Html.ValidationMessageFor(Function(model) model.MilestoneId, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.Title, htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.Title, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.Title, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.Description, htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.Description, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.Description, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.WD, htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.WD, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.WD, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.SLA, htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.SLA, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.SLA, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.PlannedEndDate, htmlAttributes:=New With {.class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.PlannedEndDate, New With { .htmlAttributes = New With { .class = "form-control" } })
                @Html.ValidationMessageFor(Function(model) model.PlannedEndDate, "", New With { .class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(Function(model) model.PlannedEndTime, htmlAttributes:= New With { .class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(Function(model) model.PlannedEndTime, New With { .htmlAttributes = New With { .class = "form-control" } })
                @Html.ValidationMessageFor(Function(model) model.PlannedEndTime, "", New With { .class = "text-danger" })
            </div>
        </div>


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        @For index As Byte = 0 To Model.EnvironmentsAvailable.Count - 1

        @<div Class="form-group">
                @Html.DisplayFor(Function(model) model.EnvironmentsAvailable(index).Name, New With {.htmlAttributes = New With {.Class = "control-label col-md-2"}})
            <div Class="col-md-10">
                <div Class="checkbox">
                    @Html.EditorFor(Function(model) model.EnvironmentsAvailable(index).IsSelected)
                    @Html.ValidationMessageFor(Function(model) model.EnvironmentsAvailable(index).IsSelected, "", New With {.class = "text-danger"})
                </div>
            </div>
        </div>

        Next


PS. Делал так

    @if Model.EnvironmentsAvailable.Count > 0 then
        @<div Class="form-group">
            @For index As Byte = 0 To Model.EnvironmentsAvailable.Count - 1
            @Html.HiddenFor(Function(model) model.EnvironmentsAvailable(index).Id)
            @Html.CheckBoxFor(Function(model) model.EnvironmentsAvailable(index).IsSelected)
            @Html.DisplayFor(Function(model) model.EnvironmentsAvailable(index).Name)
                Next
            </div>
    End If

PSS. Делал через For Each. 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
End Using

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@Section Scripts 
    @Scripts.Render("~/bundles/jqueryval")
End Section



Вот результат из вьюхе в контроллере POST


...
Рейтинг: 0 / 0
18.10.2015, 16:18
    #39079382
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Артем G,

трудно конечно читать VB.NET, но что увидел:

1. (это не относится к задаче, но всёже) Mapper.CreateMap должны вызываться один раз во всём приложении, при старте -- нельзя пихать их ни в один метод контроллера. обычно делают наследников AutoMapper.Profile, и там задают маппинг, а при старте через рефлекию собирают все такие типы и засовывают в инициализацию автомаппера. рекомендую так и сделать, настоятельно.

2. Public Overridable Property EnvironmentsAvailable As IEnumerable

— если ты хочешь двухсторонний биндинг, используй Array<>, или ICollection<> (но лучше Array<>), ведь IEnumerable — это интерфейс для передачи, но не возврата коллекции. и вообще IEnumerable не обязана быть коллекцией, а Array<> и ICollection<> — стопудовые коллекции. используй их.

хз как это всё трактуется в .NET, так как не работал с VB.NET, но см. пункт 2
...
Рейтинг: 0 / 0
18.10.2015, 16:39
    #39079400
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
По 1 пункту в реальном приложении так и есть.
По 2 пункту Вы правы. Мой недочет.
...
Рейтинг: 0 / 0
18.10.2015, 18:26
    #39079447
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Вот что заметил ModelState не содержит списков. Поэтому в source не заполнены списке на скрине под спойлером.

Почему не содержит пока не понимаю (



...
Рейтинг: 0 / 0
19.10.2015, 09:36
    #39079745
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIst form View to Controller
Хехе,

вот эти 2 инструкции очень помогли ))

http://www.exceptionnotfound.net/simple-checkboxlist-in-asp-net-mvc/

YouTube Video
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / LIst form View to Controller / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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