将SelectList"SelectedValue"传递给Controller Action Method

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?

编辑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);
}
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)

编辑2:

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.

这是为什么?

Eil*_*lon 5

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作为所有可用项的列表.