Chr*_*ris 2 asp.net-mvc selectlist
我有一个注册表单,显示用户名称(文本框),电子邮件(文本框)和分区(选择列表).名称和电子邮件已预先填充(我正在使用Windows身份验证,Intranet应用程序),我想将DropDown中的SelectedValue作为Int32发送到我的控制器,我不想再发送整个SelectList.这个清单现在很小,但会增长到相当大的规模.
我是一个名为的类RegistrationViewModel,它包含这些字段的公共属性.但是,当我SelectList用于DivisionList时,我收到此错误:No parameterless constructor defined for this object..
如果我更改Type,它没有问题,但是Division是null或0.有没有办法将SelectedValue从DropDown传递给Controller Action作为Int32?
我不确定我在做什么,我一直在使用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);
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
这是观点
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
Eilon:这也是我改变它的原因:
控制器:
public ActionResult Register()
{
ViewData["DivisionList"] = repo.GetDivisions();
return View();
}
Run Code Online (Sandbox Code Playgroud)
视图:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
Run Code Online (Sandbox Code Playgroud)
我接受了这个例外:没有ViewData项目,其键入'DivisionValue'的类型为'IEnumerable'.
当我将View更新为:
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
Run Code Online (Sandbox Code Playgroud)
它的效果非常好!如果所有"Division"项目的名称相同,它似乎只能起作用.如果我更改名称视图崩溃或ViewModel"分区"属性发送为0.
这是为什么?
该RegistrationViewModel类型应该包含一个简单类型属性,例如:
public string DivisionValue { get; set; }
Run Code Online (Sandbox Code Playgroud)
或者将类型更改为int,DateTime或任何适当的类型.
在HTML和HTTP中,为下拉列表返回的唯一内容是字段名称和所选值.
要使所有内容匹配,您还需要更改视图以为下拉列表呈现不同的输入名称:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
Run Code Online (Sandbox Code Playgroud)
请注意,我使用"DivisionValue"是列表的值,而DivisionList作为所有可用项的列表.
| 归档时间: |
|
| 查看次数: |
8889 次 |
| 最近记录: |