checkboxlist в asp.net MVC - PullRequest
       0

checkboxlist в asp.net MVC

3 голосов
/ 02 июня 2011

Я хочу создать список флажков в виде asv.net mvc и отображать дни недели (понедельник, вторник, ....).Я хочу сохранить выбранные пользователем значения в базе данных.Как я могу сделать это в MVC2

Кто-то предложил мне использовать упомянутые здесь «Типы перечисления как битовые флаги»:

http://msdn.microsoft.com/en-us/library/cc138362.aspx

как я могу использовать это?1008 *

Пожалуйста, предложите решение.

Ответы [ 3 ]

12 голосов
/ 02 июня 2011

Да, я бы также предложил перечисление в этом сценарии.

Вот как вы можете сделать это в ASP.NET MVC:

Ваше перечисление должно выглядеть следующим образом (см. Ссылку, которую выпри условии):

[Flags]
public enum Days 
{
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40 
}

Для целей повторного использования я создал общий помощник html, который выглядит следующим образом:

public static IHtmlString CheckboxListForEnum<T>(this HtmlHelper html, string name, T modelItems) where T : struct
{
    StringBuilder sb = new StringBuilder();

    foreach (T item in Enum.GetValues(typeof(T)).Cast<T>())
    {
        TagBuilder builder = new TagBuilder("input");
        long targetValue = Convert.ToInt64(item);
        long flagValue = Convert.ToInt64(modelItems);

        if ((targetValue & flagValue) == targetValue)
            builder.MergeAttribute("checked", "checked");

        builder.MergeAttribute("type", "checkbox");
        builder.MergeAttribute("value", item.ToString());
        builder.MergeAttribute("name", name);
        builder.InnerHtml = item.ToString();

        sb.Append(builder.ToString(TagRenderMode.Normal));
    }

    return new HtmlString(sb.ToString());
}

Вы можете использовать один и тот же помощник html для всех типов перечисления.

Использование:


Теперь в демонстрационных целях предположим, что у вас есть такая модель:

Модель:

public class TVShow
{
    public string Title { get; set; }

    public string Description { get; set; }

    public Days AvailableOn { get; set; }

}

Действие контроллера:

public ActionResult Show()
{
    var show = new TVShow
    {
        Title = "Late Late Show",
        AvailableOn = Days.Monday | Days.Friday
    };
    return View(show);
}

Вид (строго типизированный):

<%: Model.Title %>

<%: Model.Description %>

<%: Html.CheckboxListForEnum<Days>("days", Model.AvailableOn)%>
0 голосов
/ 31 декабря 2012

это так просто:
1. создайте класс флажка со строковым идентификатором и значением bool.
2. поставить список флажков в методе контроллера с некоторым именем.
3. Создайте 2 поля динамически в вашем представлении, но убедитесь, что вы соответствуете системе именования движка бритвы.

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

@model MyProject.Site.Models.MyWebModel  

эта модель имеет класс настроек, внутри которого есть логическое выражение, например:

public class MyWebModel  
{  
    public HighchartsSettingModel Settings { get; set; }  
}  
public class HighchartsSettingModel  
{  
    public bool JoinSameType{ get; set; }  
}

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

@Html.CheckBoxFor(x => x.Settings.JoinSameType)
Короче говоря,

создает следующий HTML-код:

<input data-val="true" data-val-required="The JoinSameType field is required." id="Settings_JoinSameType" name="Settings.JoinSameType" type="checkbox" value="true" />
<input name="Settings.JoinSameType" type="hidden" value="false" />

пока что все хорошо для CheckBoxFor, который является частью фреймворка, как мы работаем с массивами?


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

public class Checkbox{
   public string Id { get; set; }
   public bool Value { get; set; }
}

и в контроллере у вас это:

public ActionResult SensorSearch(List<Checkbox> selectedSensors, string search, string subSearch, string page, string back)

и вид будет выглядеть так:

@{  
        int counter = 0;  
        string id_name, id_id, value_id, value_name;  
    }  
    @foreach (var item in Model.SensorList)  
    {  
        id_id = "selectedSensors_" + counter + "__Value";  
        id_name = "selectedSensors[" + counter + "].Value";  
        value_id = "selectedSensors_" + counter + "__Id";  
        value_name = "selectedSensors[" + counter + "].Id";  
        counter++; 


    <li><a href="#" style="padding-top: 0px;padding-bottom: 0px;padding-right: 42px;padding-left: 0px;">
        <label style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;" data-corners="false">
            <fieldset data-role="controlgroup" >
                <input id="@id_id" name="@id_name" type="checkbox" value="true" />
                <input id="@value_id" name="@value_name" type="hidden" value="@item.Key" />                                
                <label for="@id_id" style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;">
                    <label  style="padding:10px 0px 0px 10px;">
                        <h3>@item.Key</h3>
                        <p>User Name: @item.Value</p>
                    </label>
                </label>
            </fieldset>
        </label>
        </a><a href="#" rel="external"></a>
    </li>
}
</ul>   

давайте не будем забывать форму в представлении:

@using (Html.BeginForm("SensorSearch", "Home", Model.PageNav.StayRouteValues, FormMethod.Post, new Dictionary<string, object>() { { "data-ajax", "false" }, { "id", "sensor_search_form" } }))

теперь отображаемая страница будет выглядеть так в аспекте флажка:

<li><a href="#" style="padding-top: 0px;padding-bottom: 0px;padding-right: 42px;padding-left: 0px;">
<label style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;" data-corners="false">
    <fieldset data-role="controlgroup" >
        <input id="selectedSensors_16__Value" name="selectedSensors[16].Value" type="checkbox" value="true" />
        <input id="selectedSensors_16__Id" name="selectedSensors[16].Id" type="hidden" value="10141" />                                
        <label for="selectedSensors_16__Value" style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;">
            <label  style="padding:10px 0px 0px 10px;">
                <h3>10141</h3>
                <p>User Name: 10141_TEN-2MP</p>
            </label>
        </label>
    </fieldset>
</label>
</a><a href="#" rel="external"></a>
</li>

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

это так просто: это так просто:
1. создайте класс флажка со строковым идентификатором и значением bool.
2. поставить список флажков в методе контроллера с некоторым именем.
3. Создайте 2 поля динамически в вашем представлении, но убедитесь, что вы соответствуете системе именования движка бритвы.

Я надеялся, что это помогло.

0 голосов
/ 17 декабря 2011

Существует еще более простой способ - используйте собственное расширение @ Html.CheckBoxList () отсюда: http://www.codeproject.com/KB/user-controls/MvcCheckBoxList_Extension.aspx

Пример использования (представление MVC2 с механизмом представления Razor):

  <%= Html.CheckBoxList("NAME",                  // NAME of checkbox list
                        x => x.DataList,         // data source (list of 'DataList' in this case)
                        x => x.Id,               // field from data source to be used for checkbox VALUE
                        x => x.Name,             // field from data source to be used for checkbox TEXT
                        x => x.DataListChecked   // selected data (list of selected 'DataList' in thiscase),
                                                // must be of same data type as source data or set to 'NULL'
                       ) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...