簡體   English   中英

將SelectList“ SelectedValue”傳遞給控制器​​操作方法

[英]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方法?

編輯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)%>

我收到此異常:沒有鍵類型為“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM