Asp.net mvc 2 asp.net MVC中的复选框列表

Asp.net mvc 2 asp.net MVC中的复选框列表,asp.net-mvc-2,Asp.net Mvc 2,我想在asp.net mvc视图中创建一个复选框列表,并想显示星期几(星期一、星期二……)。我想在数据库中保存用户选择的值。如何在MVC2中执行此操作 有人建议我使用这里提到的“枚举类型作为位标志”: 我如何使用它 请建议解决方案。是的,在这种情况下,我还建议使用枚举 以下是如何在ASP.NET MVC中执行此操作: 您的枚举应该如下所示(请参阅您提供的链接): 出于可重用性目的,我创建了一个通用html帮助程序,如下所示: public static IHtmlString Checkbox

我想在asp.net mvc视图中创建一个复选框列表,并想显示星期几(星期一、星期二……)。我想在数据库中保存用户选择的值。如何在MVC2中执行此操作

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

我如何使用它


请建议解决方案。

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

以下是如何在ASP.NET MVC中执行此操作:

您的枚举应该如下所示(请参阅您提供的链接):

出于可重用性目的,我创建了一个通用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.CheckBoxList()扩展名:

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

x.DataList,//数据源(本例中为“DataList”列表)
x=>x.Id,//数据源中用于复选框值的字段
x=>x.Name,//数据源中用于复选框文本的字段
x=>x.DataListChecked//所选数据(本例中所选“DataList”的列表),
//必须与源数据具有相同的数据类型或设置为“NULL”
) %>
就这么简单:
1.使用字符串id和布尔值创建checkbox类。
2.在控制器方法中使用某些名称放置复选框列表。
3.在视图中动态创建2个字段,但确保符合razor引擎命名系统

要创建动态复选框列表,您需要了解razor引擎的工作方式, 假设您拥有此代码
在视图的头部,您可以包含如下模型:

@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" />
在控制器中,您有:

public ActionResult SensorSearch(List<Checkbox> selectedSensors, string search, string subSearch, string page, string back)
public ActionResult SensorSearch(列出所选传感器、字符串搜索、字符串子搜索、字符串页面、字符串返回)
视图看起来是这样的:

@{  
        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>   
@{
int计数器=0;
字符串id\u name、id\u id、value\u id、value\u name;
}  
@foreach(Model.SensorList中的var项)
{  
id\u id=“selectedSensors”+计数器+“\u值”;
id_name=“selectedSensors[“+计数器+”].Value”;
value_id=“selectedSensors_uu”+计数器+“uu id”;
value_name=“selectedSensors[“+计数器+”].Id”;
计数器++;
  • }
    不要忘记视图中的表单:

    @using (Html.BeginForm("SensorSearch", "Home", Model.PageNav.StayRouteValues, FormMethod.Post, new Dictionary<string, object>() { { "data-ajax", "false" }, { "id", "sensor_search_form" } }))
    
    @使用(Html.BeginForm(“SensorSearch”、“Home”、Model.PageNav.statyroutevalues、FormMethod.Post、newdictionary(){{“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和布尔值创建checkbox类。
    2.在控制器方法中使用某些名称放置复选框列表。
    3.在视图中动态创建2个字段,但确保符合razor引擎命名系统


    我希望它能有所帮助。

    sql server中的日期数据类型应该是什么?数据类型可以是varchar,因为如果在本例中转换为字符串show.AvailableOn.ToString(),您将得到“星期一、星期五”。最后,此解决方案在MVC2中有效吗?我不确定我们是否可以在MVC2中创建HTMLHelper。我已经在MVC3中创建了。请建议。谢谢,它会起作用的。我已经在MVC2中创建了相同的。如果你打算使用Razor视图引擎在MVC 3 web应用程序中使用它,唯一会改变的就是视图,因为Razor视图引擎有不同的语法。我已将您的行更改为:builder.MergeAttribute(“value”,item.ToString());到builder.MergeAttribute(“value”,targetValue.ToString());然后,我使用此技术获取Post上的聚合值:var values=Request.Form[“PmtCheckBox”].Split(',');变量天数=(天数)值。聚合(0,(acc,v)=>acc |=转换为32(v),acc=>acc);//我确信有一种更优雅的方法可以做到这一点,但目前效果良好;)
    <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" />
    
    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>