2009-09-25 51 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