2015-01-02 2 views
1

Всякий раз, когда я отправляю свою форму с страницы Respond.vbhtml, моя функция Respond_post внутри контроллера вызывается как должна; однако предмет, передаваемый в FormsRespondModel, пуст.MVC Модель, не привязанная к действию HTTPPost

enter image description here

Почему мое сообщение действие не заселять мои FormsRespondModel, как должно?

FormsRespondModel.vb

Public Class FormsRespondModel 
    Public Property form As cihForm 
    Public Property lists As cihLists = New cihLists() 
    Public Property subOrgs As List(Of cihOrganizationSub) 
    Public Property Events As List(Of cihEvent) 


    Public Sub New() 

    End Sub 

    Public Sub New(formId As String) 
     form = New cihForm() 
     form.loadForm(Guid.Parse(formId)) 

     lists.loadOrganizationSubs(ZenCommon.CurrentOrgId, ZenCommon.CurrentUserId) 

     Dim emptyList() As String = {} 
     Dim eventsearchList As cihEventSearch = New cihEventSearch(ZenCommon.CurrentOrgId, "", DateTime.Now, ZenCommon.Date2050, True, emptyList, emptyList, emptyList) 

     Events = eventsearchList.eventList 
     subOrgs = lists.organizationSubs 

    End Sub 
End Class 

Respond.vbhtml

@ModelType CheckImHere.Student.FormsRespondModel 

@Using Html.BeginForm() 
@html.Hidden(Model.form.formId.ToString()) 
@For Each fld As Field In Model.form.fields 
    If fld.fieldTypeId = "text" Then 
    @<li> 
     <h4>@fld.title</h4> 
     <em>@fld.description</em> 
     <input type="text" placeholder="" value="@fld.response"/> 
     <em>@fld.isRequired</em> 
    </li> 
    End If 

    If fld.fieldTypeId = "para" Then 
    @<li> 
     <h4>@fld.title</h4> 
     <em>@fld.description</em> 
     @html.textarea(fld.response) 
     <em>@fld.isRequired</em> 
    </li> 
    End If 
Next 
<input type="submit" name="cmdSubmit" value="Submit" id="cmdSubmit"/> 

End Using 

RespondController.vb

<HttpPost> 
<ActionName("Respond")> 
Function Respond_post(viewModel As FormsRespondModel) As ActionResult 

    Return View("Respond", viewModel) 
End Function 

ответ

3

Почему мое почтовое действие не заполняет мою форму FormsRespondModel так, как должно быть?

Поскольку ваши <input> и <textarea> поля не имеют атрибут name. Таким образом, абсолютно ничего не отправляется на сервер при отправке формы.

Чтобы создать правильные поля ввода, вы можете использовать сильно типизированные помощники, такие как Html.TextBoxFor и Html.TeaxAreaFor. Вы также можете взглянуть на следующую записи в блоге, который объясняет, как именно ваши поля ввода должны быть названы, если вы хотите модель связывания для работы с коллекциями: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

Так, например, для генерации имен собственных индексатор можно заменить For Each с For петля:

@For i As Integer = 0 To Model.form.fields.Count -1 Step 1 
    If Model.form.fields(i).fieldTypeId = "text" Then 
    @<li> 
     <h4>@Html.DisplayFor(Function(x)x.form.fields(i).title)</h4> 
     <em>@Html.DisplayFor(Function(x)x.form.fields(i).description)</em> 
     @Html.TextBoxFor(Function(x)x.form.fields(i).response) 
     <em>@Html.DisplayFor(Function(x)x.form.fields(i).isRequired)</em> 
    </li> 
    End If 

    If Model.form.fields(i).fieldTypeId = "para" Then 
    @<li> 
     <h4>@Html.DisplayFor(Function(x)x.form.fields(i).title)</h4> 
     <em>@@Html.DisplayFor(Function(x)x.form.fields(i).description)</em> 
     @Html.TextAreaFor(Function(x)x.form.fields(i).response) 
     <em>@Html.DisplayFor(Function(x)x.form.fields(i).isRequired)</em> 
    </li> 
    End If 
Next 

Очевидно, что в этом примере мы имеем только поля ввода для response собственности. Таким образом, это будет единственное, что будет отправлено на сервер при отправке формы и единственного свойства в вашей модели просмотра, которое будет заполнено. Если вы хотите получить другие свойства, вам может потребоваться включить их в скрытые поля внутри формы (с помощью помощника @Html.HiddenFor). При этом вместо того, чтобы генерировать кучу скрытых полей в вашей форме, было бы намного проще просто включить в качестве скрытого поля какой-то уникальный идентификатор, который позволит вам извлечь эти свойства из вашего бэкэнда в действие POST с помощью этого идентификатора.

Смежные вопросы