Привязка данных DropDownList от Asp.Net MVC - PullRequest
6 голосов
/ 21 января 2011
                    <form id="Form1" runat="server">
                        <asp:DropDownList ID="dvmDrmList" runat="server">
                            <asp:ListItem>Theory</asp:ListItem>
                            <asp:ListItem>Appliance</asp:ListItem>
                            <asp:ListItem>Lab</asp:ListItem>
                        </asp:DropDownList>
                    </form>

Я хочу связать этот DropDownList в контроллере. Я имею в виду, как я могу получить значение dropDownList в методе действия в классе контроллера. Благодаря.

1 Ответ

9 голосов
/ 21 января 2011

Я вижу, что вы используете формы с runat="server" и asp:XXX веб-элементами управления. Эти понятия никогда не должны использоваться в ASP.NET MVC. Больше нет ViewState и PostBacks, на которые опираются эти серверные элементы управления.

Таким образом, в ASP.NET MVC вы должны начать с определения модели представления, представляющей данные:

public class ItemsViewModel
{
    public string SelectedItemId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

тогда вы бы определили контроллер с двумя действиями (одно, которое отображает представление, и другое, обрабатывающее отправку формы):

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ItemsViewModel
        {
            Items = new[]
            {
                new SelectListItem { Value = "Theory", Text = "Theory" },
                new SelectListItem { Value = "Appliance", Text = "Appliance" },
                new SelectListItem { Value = "Lab", Text = "Lab" }
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ItemsViewModel model)
    {
        // this action will be invoked when the form is submitted and 
        // model.SelectedItemId will contain the selected value
        ...
    }
}

и, наконец, вы бы написали соответствующий строго типизированный Index view:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.ItemsViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) { %>
        <%= Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items, "Value", "Text")) %>
        <input type="submit" value="OK" />
    <% } %>
</asp:Content>

Имеется в виду, что вы также можете жестко закодировать этот выбор внутри своего представления (хотя я бы не рекомендовал это делать):

<% using (Html.BeginForm()) { %>
    <select name="selectedItem">
        <option value="Theory">Theory</option>
        <option value="Appliance">Appliance</option>
        <option value="Lab">Lab</option>
    </select>
    <input type="submit" value="OK" />
<% } %>

и иметь следующий контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(string selectedItem)
    {
        // this action will be invoked when the form is submitted and 
        // selectedItem will contain the selected value
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...