表单没有提交,并没有与MVC产生错误
我在我的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这些编辑本 - 杜吉德的编辑和我已经改变了表单元素数据库字段名(用于测试至少)。现在,当页面提交时,名称,登录和电子邮件全部填满,密码为空(我假设预期的行为为每个密码框)但我仍然收到“该值'无效”错误。
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"> </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
你从哪里得到的错误?你能发布堆栈跟踪吗? – 2009-09-25 15:35:52
由于我不在办公室,现在不会在星期一。 – LiamGu 2009-09-25 17:22:38
没问题,我会保留;) – 2009-09-25 20:13:21