asp: CheckBoxList в форме - PullRequest
       46

asp: CheckBoxList в форме

0 голосов
/ 09 августа 2011

Я пытаюсь поместить флажок в простую форму в asp.NET MVC 2. Вот код для него:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm("HandSurvey", "Resources", FormMethod.Post, new { runat="server" }))
        { %>
            <asp:CheckBoxList id="chkListChemical" runat="server">
                <asp:ListItem>Fiberglass & resins</asp:ListItem>
                <asp:ListItem>Heavy duty oil paints & stains</asp:ListItem>
                <asp:ListItem>Mechanics - tools, grease/oil</asp:ListItem>
                <asp:ListItem>Metalworking fluids</asp:ListItem>
                <asp:ListItem>Paint & Stains in use</asp:ListItem>
                <asp:ListItem>Exposure to solvents</asp:ListItem>
                <asp:ListItem>Difficult soils</asp:ListItem>
                <asp:ListItem>Hydrocarbons</asp:ListItem>
            </asp:CheckBoxList>
        <% } 
    %>
</asp:Content>

Когда я попадаю на эту страницу, она выдает эту ошибку:

Элемент управления 'ctl00_MainContent_chkListChemical_0' типа 'CheckBox' должен быть помещен в тег формы с помощью runat = server.

Я думал, что правильно указал атрибут runat. Или я что-то здесь упускаю? Если я не использую вспомогательный класс и просто использую обычный тег формы, он работает.

1 Ответ

0 голосов
/ 09 августа 2011

В ASP.NET MVC вам следует избегать использования серверных элементов управления. В основном, все, что имеет runat="server", не должно использоваться (кроме заполнителя контента в движке представления WebForms). В ASP.NET MVC вы проектируете модели представления:

public class MyViewModel
{
    [DisplayName("Fiberglass & resins")]
    public bool Item1 { get; set; }

    [DisplayName("Heavy duty oil paints & stains")]
    public bool Item2 { get; set; }

    ...
}

тогда у вас есть действия контроллера, которые управляют моделью представления:

// Action that renders the view
public ActionResult Index()
{
    var model = new MyViewModel();
    return View(model);
}

// Handles the form submission
[HttpPost]
public ActionResult Index(MyViewModel model)
{
    // TODO: Process the results
    return View(model);
}

и, наконец, у вас строго типизированное представление:

<% using (Html.BeginForm("HandSurvey", "Resources")) { %>
    <div>
         <%= Html.CheckBoxFor(x => x.Item1) %> 
         <%= Html.LabelFor(x => x.Item1) %>
    </div>
    <div>
         <%= Html.CheckBoxFor(x => x.Item2) %> 
         <%= Html.LabelFor(x => x.Item2) %>
    </div>

    ...

    <p><input type="submit" value="OK" /></p>
<% } %>

UPDATE:

В соответствии с запросом в разделе комментариев для динамического генерирования этих флажков из базы данных очень просто адаптировать нашу модель представления:

public class ItemViewModel
{
    public int Id { get; set; }
    public string Text { get; set; }
    public bool IsChecked { get; set; }
}

и теперь у нас будет действие контроллера для возврата списка этой модели представления:

public ActionResult Index()
{
    // TODO: obviously those will come from a database
    var model = new[]
    {
        new ItemViewModel { Id = 1, Text = "Fiberglass & resins" },
        new ItemViewModel { Id = 2, Text = "Heavy duty oil paints & stains" },
    };
    return View(model);
}

и вид теперь просто станет:

<% using (Html.BeginForm("HandSurvey", "Resources")) { %>
    <%= Html.EditorForModel() %>
    <p><input type="submit" value="OK" /></p>
<% } %>

и последняя часть будет определять шаблон редактора для нашей модели представления (~/Views/Shared/EditorTemplates/ItemViewModel.ascx):

<%@ Control 
    Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.ItemViewModel>" 
%>
<div>
    <%= Html.HiddenFor(x => x.Id) %>
    <%= Html.CheckBoxFor(x => x.IsChecked) %>
    <%= Html.DisplayFor(x => x.Text) %>
</div>
...