我有一个注册表单,其中显示了用户名(文本框)、电子邮件(文本框)和部门(SelectList)。名称和电子邮件已预先填充(我使用的是 Windows 身份验证、Intranet 应用程序),并且我想将 DropDown 中的 SelectedValue 作为 Int32 发送到我的控制器,我不想将整个 SelectList 发回。这个列表现在很小,但会增长到相当大的规模。
我有一个名为 的类RegistrationViewModel
,它包含这些字段的公共属性。但是,当我使用SelectList
DivisionList 时,我收到此错误:No parameterless constructor defined for this object.
.
如果我更改类型,它没有问题,但 Division 为 null 或 0。有没有办法将 SelectedValue 从 DropDown 传递给控制器 Action 方法作为 Int32?
编辑1:
我不太确定自己在做什么,我已经使用 MVC 大约 48 小时,观看了 PDF、TechEd 和 TechDays 视频。
抱歉,这是我的控制器代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(RegistrationViewModel rvm)
{
IApplicationContext context = ContextRegistry.GetContext();
IValidationErrors errors = new ValidationErrors();
IValidator validator = (IValidator)context.GetObject("RegistrationValidator");
bool valid = validator.Validate(rvm, errors);
if (valid)
repo.SaveRegistration();
else
ViewData["DivisionList"] = repo.GetDivisions();
return View(rvm);
}
RegistrationViewModel
班级
public class RegistrationViewModel
{
public string Name { get; set; }
public string Email { get; set; }
//public SelectList DivisionList { get; private set; }
public int Division { get; set; }
}
这是视图
<%@ Page Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<RegistrationViewModel>" %>
<%@ Import Namespace="Project1.Entities"%>
<%@ Import Namespace="Project1.Models"%>
<asp:Content ID="registerTitle" ContentPlaceHolderID="TitleContent" runat="server">
Register
</asp:Content>
<asp:Content ID="registerContent" ContentPlaceHolderID="MainContent" runat="server">
...
<% using (Html.BeginForm())
{ %>
<div>
<fieldset>
<legend>Account Information</legend>
<p>
<label for="name">Name:</label>
<%= Html.TextBox("Name", User.Identity.Name.GetDisplayName()) %>
<%= Html.ValidationMessage("username") %>
</p>
<p>
<label for="email">Email:</label>
<%= Html.TextBox("email", User.Identity.Name.GetEmailFromLogin()) %>
<%= Html.ValidationMessage("email") %>
</p>
<p>
<label for="division">Division:</label>
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
<%= Html.ValidationMessage("confirmPassword") %>
</p>
<p>
<input type="submit" value="Register" />
</p>
</fieldset>
</div>
<% } %>
</asp:Content>
编辑2:
Eilon:这也是我改变它的地方:
控制器:
public ActionResult Register()
{
ViewData["DivisionList"] = repo.GetDivisions();
return View();
}
看法:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
我收到此异常:没有具有“IEnumerable”类型的键“DivisionValue”的 ViewData 项。
当我将视图更新为:
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
它工作得很好!只有在所有“部门”项目名称相同的情况下,它似乎才有效。如果我更改名称,View 崩溃或 ViewModel“Division”属性被发送为 0。
这是为什么?