asp.net MVC中的checkboxlist

时间:2011-06-02 17:08:01

标签: asp.net-mvc-2

我想在asp.net mvc视图中创建一个checkboxlist,并希望显示工作日(星期一,星期二,......)。我想保存用户在数据库中选择的值。我怎么能在MVC2中做到这一点

有人建议我使用这里提到的“枚举类型为位标志”:

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

我该如何使用它?

请建议解决方案。

3 个答案:

答案 0 :(得分:12)

是的,我也建议在这种情况下使用枚举。

以下是如何在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)%>

答案 1 :(得分:0)

甚至更简单的方法 - 从这里使用自定义@ Html.CheckBoxList()扩展: http://www.codeproject.com/KB/user-controls/MvcCheckBoxList_Extension.aspx

用法示例(使用Razor视图引擎的MVC2视图):

  <%= 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'
                       ) %>

答案 2 :(得分:0)

这很容易:
 1.使用字符串id和bool值创建复选框类  2.在控制器方法中放置一个带有名称的复选框列表  3.在视图中动态创建2个字段,但要确保符合剃刀引擎命名系统。

要创建动态复选框列表,您需要了解剃刀引擎的工作方式, 说你有这个代码
在视图的头部,你包括一个像这样的模型:

@model MyProject.Site.Models.MyWebModel  

该模型有一个设置类,里面有一个bool:

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非常好,这是框架的一部分,我们如何使用数组?


所以现在我们需要做的就是了解如何在控制器方法中使用list, 说你有这个班:

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>

您需要注意的是输入复选框的名称和我们使用的输入隐藏类似于razor引擎创建名称的方式,因此在提交引擎后会将其渲染为数组,因此您可以创建任何你想要的动态复选框列表,就像你在任何其他语言中一样(比如php等等)。

很容易: 这很容易:
 1.使用字符串id和bool值创建复选框类  2.在控制器方法中放置一个带有名称的复选框列表  3.在视图中动态创建2个字段,但要确保符合剃刀引擎命名系统。

我希望它有所帮助。