【问题标题】:Razor MVC get select option ID for SQL statementRazor MVC 获取 SQL 语句的选择选项 ID
【发布时间】:2016-06-30 22:40:02
【问题描述】:

我正在尝试使用 razor 提交一个简单的表单,需要

<select>
   <option id=""> //this is what i neeed to perform an insert >
   </option>
</select>

我的剃刀语法如下:

@Html.DropDownListFor(model => model.aPracticar.Value, actividades , "Seleccione la actividad" ,new { @class="form-control" })

该值本身不会起作用,因为我需要执行 sql 连接并且我不知道如何通过 razor 获取该 id。任何帮助将不胜感激。谢谢!!

编辑:

抱歉更新迟了。找到了一个相对简单的解决方法,因为我必须使用 id 而不是选择列表中的值来实现 Javascript 函数。我完全意识到这可能不是正确使用 razor,但与重写整个模型/视图/控制器相比证明是有效的

    <div class="editor-label">
     @Html.LabelFor(model => model.aPracticar.Value, "Actividad")
    </div>
    <div class="editor-field">
        <select class="form-control" id="aPracticar_Value" >                
            <option value="">Seleccione la actividad...</option>
             @foreach (var actividad in actividades)
             {  
                <option id="@actividad.idDeporte" value="@actividad.Value">
                          @actividad.Text</option>

         }                                   
    </select>
     @Html.HiddenFor(u => u.aPracticar.idDeporte)
     <br />
 </div>

但是,我将以下答案之一标记为正确,因为它是 Razor 预期用途的一个示例。再次感谢大家提供有用的 cmets。

【问题讨论】:

  • &lt;option&gt; 元素需要value 属性(不是id)和&lt;select&gt; 回发selected 选项的值(如果没有value 属性,则返回文本存在)。 DropDownListFor() 方法中的 actividades 是什么? - DropDownListFor() 方法将正确地完成所有这些,只要您提供正确的数据。

标签: c# asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

如果您的实体具有来自另一个实体的外键,并且您希望通过 razor 在 DropDown 中显示所有其他实体值,您可以首先在您的操作中创建一个 selectList,该操作会转到您的视图,例如:

var aPracticar=_modelService.getAll();   

ViewBag.Parcticar=new SelectList(aPracticar,"ID","Title");

然后通过 viewBag 将此 selectList 发送到您的视图并在视图中使用:

@Html.DropDownListFor(model => model.aPracticar,(SelectList)ViewBag.Parcticar)

它可以在您的 html 中使用键和值创建 selectList,键是 aPracticar 的 Id,值是您想要显示为 selectList 标题的内容。

/* 编辑了错误的评论,而不是我的原始帖子,对不起! */

【讨论】:

    【解决方案2】:

    要通过DropDownList 助手插入下拉列表选项,请构建List&lt;SelectListItem&gt; 或从预定义模型创建SelectList 构造函数:

    // assume Model.Selecciones is an IEnumerable option list
    @Html.DropDownListFor(model => model.aPracticar, "actividades", new SelectList(Model.Selecciones), new { @class="form-control" })
    
    // assume Model.ListaSelecciones is a SelectListItem option list
    @Html.DropDownListFor(model => model.aPracticar, "actividades", Model.ListaSelecciones, new { @class="form-control" })
    

    它们都会大致翻译成 HTML,如下所示:

    <select class="form-control" name="aPracticar">
        <option value="Valor">Texto</option>
        <!-- other option values -->
    </select>
    

    如果你想建立一个SelectListItem的列表:

    Model.ListaSelecciones = new List<SelectListItem>();
    
    lista.Add(new SelectListItem() { Text = "Texto", Value = "Valor" } // example for adding option item to drop down list
    

    但是,如果您倾向于直接绑定选择列表项来查看,请首先在您的模型上提供文本值对。

    从下拉列表中选择的值将在表单提交时自动插入到model.aPracticar 属性中。

    附录:DropDownList 生成的选项标签默认不包含“id”属性。您需要使用类似于此的扩展选项标签属性制作自定义 HTML 助手:

    public class ExtendedSelectListItem : SelectListItem
    {
        public Object htmlAttributes { get; set; }
    }
    
    public class CustomHtmlHelper
    {
        // taken from stackoverflow.com/a/7772354: requires by HTML helper to get model state
        public static Object GetModelStateValue(HtmlHelper helper, String key, Type destinationType)
        {
            ModelState state;
            if (helper.ViewData.ModelState.TryGetValue(key, out state))
            {
                if (state.Value != null)
                {
                    return state.Value.ConvertTo(destinationType, CultureInfo.InvariantCulture);
                }
            }
            return null;
        }
    
        // this part inspired from stackoverflow.com/a/7537628
        public static MvcHtmlString DropDownListForId<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<ExtendedSelectListItem> selectList, String optionLabel, Object htmlAttributes = null)
        {
            String name = ExpressionHelper.GetExpressionText(expression);
            String fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
            if (String.IsNullOrEmpty(fullName))
            {
                throw new ArgumentException("Name is undefined");
            }
    
            if (selectList == null)
            {
                throw new ArgumentException("Select list is empty");
            }
    
            Object defaultValue = GetModelStateValue(helper, fullName, typeof(String));
            if (defaultValue == null) 
            {
                defaultValue = helper.ViewData.Eval(fullName);
            }
            else
            {
                var defaultValues = new[] { defaultValue };
                IEnumerable<String> listvalues = (from value in defaultValues select value.ToString();
                var selectedValues = new HashSet<String>(listvalues, StringComparer.OrdinalIgnoreCase);
                var newSelectList = new List<ExtendedSelectListItem>();
    
                foreach (ExtendedSelectListItem item in selectList)
                {
                    item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
                    newSelectList.Add(item);
            }
            selectList = newSelectList;
            }
    
            var listItems = new StringBuilder();
            foreach (ExtendedSelectListItem item in selectList)
            {
                listItems.Append(ListItemToOption(item));
            }
    
            var tagBuilder = new TagBuilder("select")
            {
                InnerHtml = listItems.ToString()
            };
    
            tagBuilder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
            tagBuilder.MergeAttribute("name", fullName, true);
            tagBuilder.GenerateId(fullName);
    
            ModelState state;
            if (helper.ViewData.ModelState.TryGetValue(fullName, out state))
            {
                if (state.Errors.Count > 0)
                {
                   tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
                }
            }
            tagBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(name));
    
            return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
        }
    
    
        public static String ListItemToOption(ExtendedSelectListItem item)
        {
            var builder = new TagBuilder("option")
            {
                InnerHtml = HttpUtility.HtmlEncode(item.Text)
            };
    
            if (item.Value != null)
            {
                builder.Attributes["value"] = item.Value;
                builder.Attributes["id"] = item.Value;
            }
            if (item.Selected)
            {
                builder.Attributes["selected"] = "selected";
            }
            builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(item.htmlAttributes));
            return builder.ToString(TagRenderMode.Normal);
        }
    }
    

    请阅读https://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlist(v=vs.118).aspx以正确使用 DropDownListFor 模型绑定。

    【讨论】:

    • 您的DropDownListForId() 分机有什么意义?将 id 属性添加到 &lt;option&gt; 不会执行任何操作(&lt;select&gt; 元素提交 value 属性 - id 只是被忽略)
    • 对,id 属性仅在 OP 想要从 JS 客户端获取选项 id 或从 ajax 回调发送时可用,类似于为 &lt;option&gt; 标签添加类属性。 DDL 本身总是在回发时通过 value 属性将数据发送到绑定模型,如果没有定义值,则发送选项文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2014-06-24
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多