Domanda

Ho una forma nella mia applicazione MVC che in teoria dovrebbe inviare i dati di nuovo al mio database utilizzando una classe repository.

Tuttavia, quando ho inviare il modulo ( http: // localhost: 1028 / Admin / NewUser / ), i cambiamenti URL a cui il modulo deve essere sottomettersi a, che va bene ( http: // localhost:. 1028 / Admin / NewUser / Invia ), ma una volta che è stata presentata, si deve inviare l'utente a una pagina di conferma

Da quello che posso dire, mi sto muovendo attraverso tutte le mie pagine correttamente fino a quando si tratta di presentare, in cui si mostra di nuovo, ma in / Amministratore / NewUser / Invia ed i dati è la forma non inserito nel database.

Questa è l'ActionResult che sto usando:

Public Function Submit() As ActionResult
         Try
            Dim user = New hdUser() With { _
                .userLogon = Request.Form("UserLogin"), _
                .userPass = Request.Form("UserPassword"), _
                .userEmail = Request.Form("UserEmail"), _
                .RealName = Request.Form("UserFullName"), _
                .isLive = 1, _
                .avatar = "noavatar.gif" _
             }
            userRepository.Add(user)
            userRepository.Save()

            Return Redirect("/Admin/NewUser/Confirm")
        Catch ex As Exception
            ModelState.AddModelError("Error", ex)
        End Try
        Return View()
    End Function

Sono abbastanza nuovo per MVC quindi non sono del tutto sicuro se quanto precede è corretta o meno.

E nella mia classe repository di dati UserRepository.vb , le due funzioni che sto usando sono:

Public Sub Add(ByVal user As hdUser) Implements IUserRepository.Add
            db.hdUsers.InsertOnSubmit(user)
        End Sub

e

Public Sub Save() Implements IUserRepository.Save
            db.SubmitChanges()
        End Sub

E la forma che ho creato è:

<form action="/Admin/NewUser/Submit" method="post">
                <table border="0" cellpadding="0" cellspacing="2">
                    <tr>
                        <td><strong>User's Full Name</strong> <br />
                         <%=Html.TextBox("UserFullName")%>
                            </td>
                    </tr>
                    <tr>
                        <td><strong>User Login</strong> <br />
                         <%=Html.TextBox("UserLogin")%>
                            </td>
                    </tr>
                    <tr>
                        <td><strong>Password</strong> <br />
                         <%=Html.Password("UserPassword")%>
                           </td>
                    </tr>
                    <tr>
                        <td><strong>Email Address</strong> <br />
                         <%=Html.TextBox("UserEmail")%>
                         </td>
                    </tr>
                    <tr>
                        <td align="right"><input type="submit" value="Create" /></td>
                    </tr>
                </table>
        </form>

Il codice non produce eventuali errori, ma anche non sembra essere la presentazione al database. Quindi io non sono del tutto sicuro dove ho sbagliato.

Potrebbe essere evidente a qualcuno più esperto, ma io in realtà non hanno la minima idea su questo.

E 'questo il mio codice che sta causando il problema o qualche altro difetto?

Grazie in anticipo per qualsiasi aiuto.


Modifica Sulla base Zhaph - Ben Duguid commento, ho fatto le seguenti modifiche:

AdminController.vb

<AcceptVerbs(HttpVerbs.Post)> _
    Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
        Try
            Dim user = New hdUser()
            user.userLogon = Request.Form("UserLogin")
            user.userPass = Request.Form("UserPassword")
            user.userEmail = Request.Form("UserEmail")
            user.RealName = Request.Form("UserFullName")
            user.isLive = 1
            user.avatar = "noavatar.gif"
            UpdateModel(user)
            userRepository.Add(user)
            userRepository.Save()
        Catch ex As Exception
            ModelState.AddModelError("Error", ex)
        End Try
        Return View()
    End Function

NewUser.aspx

<%Html.BeginForm()%>
            <%=Html.ValidationMessage("Error")%>
                  <table border="0" cellpadding="0" cellspacing="2">
                    <tr>
                        <td><strong>User's Full Name</strong> <br />
                         <%=Html.TextBox("UserFullName")%>
                            <%=Html.ValidationMessage("Name", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>User Login</strong> <br />
                         <%=Html.TextBox("UserLogin")%>
                            <%=Html.ValidationMessage("Username", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>Password</strong> <br />
                         <%=Html.Password("UserPassword")%>
                            <%=Html.ValidationMessage("Password", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>Email Address</strong> <br />
                         <%=Html.TextBox("UserEmail")%>
                         <%=Html.ValidationMessage("Email", "*")%></td>
                    </tr>
                    <tr>
                        <td align="right"><input type="submit" value="Create" /></td>
                    </tr>
                </table>
                <% Html.EndForm() %>

che ora produce un errore di Il valore '' non è valido. per me.

Questo significa che i valori di modulo non vengono passati correttamente al controllore?


Modifica Ho fatto quelle modifiche in risposta Zhaph - Modifica di Ben Duguid e ho cambiato gli elementi modulo per i nomi dei campi DB (per le prove, almeno). E ora, quando la pagina viene presentato Nome, Login e-mail sono tutti pieni, password è vuota (che sto assumendo è il comportamento previsto come da scatole di password), ma ho ancora ricevere il "Il valore '' non è valido" di errore.

È stato utile?

Soluzione

Response.Write nel controller non ha intenzione di fare qualcosa per la vista.

Si dovrebbe essere restituendo il vostro modello di nuovo alla pagina di modifica, con eventuali errori in

ModelState.AddModelError();

C'è un ottimo esempio di come è possibile implementare un modello Repository, e sfruttare il modello di ASP.NET MVC caratteristiche vincolanti, ecc nella NerdDinner Capitolo dal libro professionale ASP.NET MVC.

Un controller esempio ho (in C # ho paura) sulla base dei campioni Nerd Cena:

//
// POST: /AdminAlbums/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
  var album = new Album();

  // Method on System.Web.Mvc.Controller, that takes a form collection, and
  // using reflection on the Model, assigns values to it from the form.
  UpdateModel(album);

  if (album.IsValid)
  {
    // These methods are the same as yours
    m_PhotoRepository.Add(album);
    m_PhotoRepository.Save();

    // In this instance, I'm returning the user to a list view of Albums
    // for editing, probably ought to send them to the page to start 
    // uploading photos.
    return RedirectToAction("Index");
  }

  // Still here, so I'm going to set up some ViewData I need.
  ViewData["Title"] = "Create a new album";
  ViewData["Message"] = "Create Album";

  // I'm picking up errors from the model here.
  // RuleViolation is my own class, implemented in a partial on Album.
  foreach (RuleViolation violation in album.GetRuleViolations())
  {
    ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
  }

  return View(album);
}

Così si può vedere torno il modello torna alla schermata principale se c'è un errore, per popolare il riepilogo di convalida.

La parte rilevante della vista è:

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
  <fieldset>
    <legend>Album details</legend>
    <div class="form_row">
      <label for="Caption" class="left_label">Album caption:</label>
      <%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
      <%= Html.ValidationMessage("Caption", "*") %>
      <div class="cleaner">&nbsp;</div>
    </div>
    <div class="form_row">
      <label for="IsPublic" class="left_label">Is this album public:</label>
      <%= Html.CheckBox("IsPublic", Model.IsPublic) %>
    </div>
    <div class="form_row">
      <input type="submit" value="Save" />
    </div>
  </fieldset>
<% } %>

Modifica in risposta alla domanda di modifica

Mi dispiace, ho dovuto chiarire:

Un sacco di questo si basa su utilizzando i metodi di assistenza fornite dal framework ASP.NET MVC - si noterà che sto usando metodi come Html.TextBox per generare i miei campi, con il loro nome / id tirato dal modello stesso . In questo modo, se carico la vista con ModelErrors nel ModelState, l'aiutante aggiungerà i dettagli rilevanti per il formato HTML per includere il seguente mark-up

<label for="Caption" class="left_label">Caption:</label>
<input class="input-validation-error textbox" 
       id="Caption" name="Caption" type="text" value="" />
<span class="field-validation-error">*</span>

L'altra opzione si potrebbe avere sarebbe quella di aggiungere un messaggio alla raccolta ViewData, e se ha un valore, mostrare che il vostro punto di vista.


Modifica in risposta alla domanda di modifica

Un paio di cose da tenere a mente:

1) Gli identificatori degli elementi modulo ei controlli di convalida devono essere uguali:

<%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
<%= Html.ValidationMessage("Caption", "*") %>

(avete cose come "UserEmail" e "Email")

2) Si dovrebbe essere restituendo il hdUser alla vista in caso di errore - in modo da provare qualcosa di simile:

<AcceptVerbs(HttpVerbs.Post)> _
Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
  Dim user = New hdUser()
  Try
    UpdateModel(user)
    user.isLive = 1
    user.avatar = "noavatar.gif"

    userRepository.Add(user)
    userRepository.Save()
  Catch ex As Exception
      ModelState.AddModelError("Error", ex)
  End Try
  Return View(user)
End Function
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top