[英]Pass SelectList “SelectedValue” to Controller Action Method
我有一個注冊表單,其中顯示了用戶名(文本框),電子郵件(文本框)和部門(SelectList)。 名稱和電子郵件已預先填充(我正在使用Windows身份驗證,Intranet應用程序),並且我希望將Dropdown中的SelectedValue作為Int32發送到我的控制器,我不想將整個SelectList發送回去。 該列表現在很小,但是將會增長到可觀的規模。
我的類稱為RegistrationViewModel
,它包含這些字段的公共屬性。 但是,當我將SelectList
用於DivisionList時,會收到此錯誤: No parameterless constructor defined for this object.
。
如果我更改Type,則沒問題,但是Division為null或0。是否可以將SelectedValue從DropDown傳遞給Int32的Controller Action方法?
我不確定自己在做什么,我已經使用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>
Eilon:這也是我所做的更改:
控制器:
public ActionResult Register()
{
ViewData["DivisionList"] = repo.GetDivisions();
return View();
}
視圖:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
我收到此異常:沒有鍵類型為“ DinumValue”的“ IEnumerable”類型的ViewData項目。
當我將視圖更新為:
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
效果很好! 如果所有“部門”項目都相同地命名,這似乎才起作用。 如果更改名稱,則視圖崩潰或ViewModel的“ Division”屬性發送為0。
這是為什么?
RegistrationViewModel類型應包含一個簡單類型的屬性,例如:
public string DivisionValue { get; set; }
或將類型更改為int,DateTime或任何適當的類型。
在HTML和HTTP中,唯一返回到下拉列表的內容是字段名稱和所選值。
為了使所有內容匹配,還需要更改視圖以為下拉列表呈現不同的輸入名稱:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
請注意,我使用“DivisionValue”是列表的價值 ,並作為DivisionList所有可用項的列表。
我只是對SelectList
類型更明確。 我建議在控制器動作中創建SelectList
,而SelectList
在視圖中進行轉換。 我的代碼如下所示(“ CRUD編輯”頁面):
..在動作中:
ViewData["WorkType.ID"] = new SelectList(this._vacancySvc.GetVacancyWorkTypes(),
"ID", "Name", ViewData["WorkType.ID"] ?? vacancy.WorkType.ID);
..並在視圖中:
<p><% =Html.Encode("Work Type:") %><br />
<% =Html.DropDownList("Worktype.ID")%><span class="smallgrey">(required)</span><br />
..您可以看到,通過使用[null合並運算符] [1](??),持久化了初始選擇(來自數據庫)或來自回發的ViewData(例如,表單驗證失敗)。
此外,如果我重構此代碼,則可能會像您一樣使用ViewModel對象。 唯一的事情是:(1)您永遠不需要在視圖視圖中引用ViewModel SelectList
屬性Html.DropDownList()
通過Html.DropDownList()
重載為我們自動綁定此視圖。和(2)我仍然需要引用無論如何,操作中的ViewData都會從失敗的驗證帖子中獲取選定的值,那么真正的意義是什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.