Потеря данных формы MVC после проверки - PullRequest
1 голос
/ 02 ноября 2010

Хорошо, позвольте мне начать с того, что я новичок в MVC.Учитывая это, я использую версию MVC, поставляемую с Visual Studio 2010. Это также использует Visual Basic, но я уверен, что вы сможете понять это, как только увидите код.

Я пытаюсь проверить свои данные, и процесс проверки работает правильно.Однако, если проверка не проходит, значения, которые были в моем текстовом поле, не перезагружаются в форме.

Моя форма довольно проста, поскольку я хотел начать с чего-то простого для моего первого приложения.Он состоит из таблицы, которая связана с набором объектов Соглашения.Внизу таблицы у меня есть два текстовых поля для добавления нового соглашения.Именно эти два текстовых поля не возвращают данные, отправленные им.

Вот представление:

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Food.Master" Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of NdaToolLibrary.BusinessLayer.Agreement))" %>

<asp:Content ID="Content1" ContentPlaceHolderID="PrimaryContent" runat="server">

<h1>Agreement List</h1>

<table cellpadding="0" cellspacing="0" border="0" class="tableDefault" style="width: 300px !important">
    <tr>
        <th>
            AccountType
        </th>
        <th>
            NationalId
        </th>
        <th></th>
    </tr>

<% For i As Integer = 0 To Model.Count - 1%>

    <tr class="<%= IIF(i mod 2 = 0, "", "detailRow") %>">
        <td>
            <%: Model(i).AccountType%>
        </td>
        <td>
            <%: Model(i).NationalId%>
        </td>
        <td>
            <%: Html.RouteLink("Delete", "Delete", New With {.action="Delete", .acctType = Model(i).AccountType, .id = Model(i).NationalId})%>
        </td>
    </tr>

<% Next%>

    <tr class="footerRow">
        <td>
            <%= Html.TextBox("AccountType")%>
            <%= Html.ValidationMessage("AccountType", " ")%>
        </td>
        <td>
            <%= Html.TextBox("NationalId")%>
            <%= Html.ValidationMessage("NationalId"," ")%>
        </td>
        <td>
            <a href="javascript: document.forms[0].action='/Agreement/Create'; document.forms[0].submit();">Create</a>
        </td>
    </tr>
</table>

<%= Html.ValidationSummary("Could not save agreement. Reasons include:", New with{.class = "red"})%>
</asp:Content>

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

Namespace Web
Public Class AgreementController
    Inherits System.Web.Mvc.Controller

    Public Function Create(ByVal FormValues As FormCollection) As ActionResult
        Dim agreement As New BusinessLayer.Agreement()

        agreement.AccountType = FormValues("AccountType").ToString()
        agreement.NationalId = FormValues("NationalId").ToString()

        If agreement.IsValid Then
            Try
                agreement.Save()
            Catch ex As Exception
                ModelState.AddModelError("", ex.Message)
            End Try
        Else
            For Each validationError As BusinessLayer.DataValidationMessage In agreement.GetValidationResults()
                ModelState.AddModelError(validationError.Property, validationError.Message)
            Next
        End If

        'Try
        '    agreement.AccountType = FormValues("AccountType").ToString()
        '    agreement.NationalId = FormValues("NationalId").ToString()

        '    agreement.Save()
        'Catch dvEx As BusinessLayer.DataValidationException
        '    For Each validationError As BusinessLayer.DataValidationMessage In dvEx.ValidationMessages
        '        ModelState.AddModelError(validationError.Property, validationError.Message)
        '    Next
        'Catch ex As Exception
        '    ModelState.AddModelError("", ex.Message)
        'End Try

        Dim agreements As New BusinessLayer.AgreementCollection()
        agreements.Load()

        Return View("Index", agreements)
    End Function

    Public Function Delete(ByVal AcctType As String, ByVal Id As String) As ActionResult
        Dim agreement As New BusinessLayer.Agreement()
        agreement.AccountType = AcctType
        agreement.NationalId = Id

        Return View("Delete", agreement)
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Delete(ByVal AcctType As String, ByVal Id As String, ByVal FormValues As FormCollection) As ActionResult
        Dim agreement As New BusinessLayer.Agreement(AcctType, Id)
        agreement.Delete()

        Return RedirectToAction("Index")
    End Function

    Public Function Index() As ActionResult
        Dim agreements As New BusinessLayer.AgreementCollection()
        agreements.Load()

        ' Return View("Index", agreements) is implied because the view has the same name as the action
        Return View(agreements)
    End Function



End Class
End Namespace

1 Ответ

3 голосов
/ 03 ноября 2010

Прежде всего я думаю, что вы должны извлечь свои поля, необходимо создать новую учетную запись в отдельном представлении (сейчас это на главной странице).Вы можете получить доступ к этому новому представлению, поместив ссылку на него в представлении главной страницы.Ваш новый вид должен быть строго типизирован (вам нужно создать модель для него).И поместите поля, необходимые для создания вашей учетной записи, в оператор using (Html.BeginForm ()) {} на новой странице просмотра.
И на контроллере должно быть что-то вроде

public void Create(YourModelType model)
{
     if (!ModelState.IsValid) //this will check if there are validation errors after  binding 
     {
        return View(model); //this will repopulate back the input collected from the form
     }
     //here you can put your code to process the creation 
}

привести пример на C #, но я не знаю VB.

Надеюсь, что мой ответ поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...