2009-09-25 65 views
1

我在我的MVC應用程序中有一個表單,理論上應該使用存儲庫類將數據提交回我的數據庫。表單沒有提交,並沒有與MVC產生錯誤

然而,當我提交表單(http://localhost:1028/Admin/NewUser/),該URL變化到形式應該被提交到,這是很好的(http://localhost:1028/Admin/NewUser/Submit),但一旦被提交,就應該向用戶發送到確認頁面。

從我所知道的情況來看,我正確地瀏覽了我的所有頁面,直到它提交,它再次顯示錶單,但在/Admin/NewUser/Submit之後,數據未插入到數據庫。

這是我使用的ActionResult:

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 

我是相當新的MVC所以我不能完全肯定,如果上面的正確與否。

在我的數據倉庫類UserRepository.vb,我使用這兩個功能是:

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

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

我創建的形式是:

<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> 

該代碼不會產生任何錯誤,但也似乎沒有提交給數據庫。所以我不完全確定我出錯的地方。

這對一個更有經驗的人來說可能是顯而易見的,但我真的對這一個毫無頭緒。

這是我的代碼,這是導致問題或一些其他錯誤?

在此先感謝您的幫助。


編輯:基於Zhaph本 - 杜吉德評論,我已經做了如下修改:

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() %> 

現在產生一個錯誤值''是無效的。對我來說。

這是否意味着表單值沒有正確傳遞給控制器​​?


編輯:我做了迴應Zhaph這些編輯本 - 杜吉德的編輯和我已經改變了表單元素數據庫字段名(用於測試至少)。現在,當頁面提交時,名稱,登錄和電子郵件全部填滿,密碼爲空(我假設預期的行爲爲每個密碼框)但我仍然收到「該值'無效」錯誤。

+0

你從哪裏得到的錯誤?你能發佈堆棧跟蹤嗎? – 2009-09-25 15:35:52

+0

由於我不在辦公室,現在不會在星期一。 – LiamGu 2009-09-25 17:22:38

+1

沒問題,我會保留;) – 2009-09-25 20:13:21

回答

3

Response.Write在你的控制器中不會對視圖做任何事情。

模型早在

ModelState.AddModelError(); 

您應該返回到編輯頁面,使用任何錯誤有一個如何實現一個資源庫模式,並採取了ASP.NET MVC的優勢,一個很好的例子模型綁定功能等來自Professional ASP.NET MVC書籍的NerdDinner Chapter

一個例子控制器我有一個基於書呆子晚餐樣本(在C#恐怕):

// 
// 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); 
} 

所以你可以看到我返回到模型返回到主視圖,如果有錯誤,至填充驗證摘要。

視圖的相關部分是:

<%= 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> 
<% } %> 

響應編輯質疑編輯

對不起,我應該澄清:

很多,這是基於使用ASP.NET MVC框架提供的Helper方法 - 您會注意到我使用的方法如Html.TextBox生成m y字段,其名稱/ ID從模型本身拉出。這樣,如果我加載在該ModelState中ModelErrors認爲,助手將相關的詳細信息添加到呈現的HTML包括以下加價

<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> 

你可以有另一種選擇是添加一個消息到ViewData集合,如果它具有值,則在您的視圖中顯示該集合。響應


編輯質疑編輯

幾件事情要記住:

1)表單元素和驗證控件的標識應該是相同的:

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

(你有喜歡的東西 「USEREMAIL」 和 「電子郵件」)

2)你應該返還hdUser對錯誤的觀點 - 因此嘗試是這樣的:

<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 
+0

我已經根據您評論的最新修訂版進行了修改。 – LiamGu 2009-09-25 14:12:11

+0

Form元素的名稱應該與DB字段相同嗎? – LiamGu 2009-09-25 14:40:10