如何设置默认值以在运行时选择MVC中的列表

时间:2015-07-02 01:22:53

标签: asp.net-mvc selectlist

我有一个视图,它循环遍历模型并以可编辑模式显示细节。其中一个模型值来自下面的选择列表

@if (Model != null)
    {
    for (int i = 0; i < Model.provider_service_dtls.Count; i++)
     {
    <tr>
    <td> @Html.DropDownListFor(m => m.provider_service_dtls[i].activity_code_type,
 (SelectList)@ViewBag.activity_code_type, "--- Select Activity Code Type ---", new { @class = "m-wrap" })</td>
    <td>@Html.TextBoxFor(m => m.provider_service_dtls[i].activity_name)</td>    
    </tr>

    }
    } 

此处ViewBag.activity_code_type在提交时包含值Internal & Standard,如果用户选择Internal,其值1将传递给控制器​​,如果Standard将{ {1}}此处默认值为2

enter image description here

现在,当我在编辑模式下打开相同的请求时,如果"--- Select Activity Code Type ---"的模型值为provider_service_dtls[i].activity_code_type,则选择列表应默认选为1Internal如果是是Standard

我这样编码

2

但它没有按预期工作,它将结果如下图所示

enter image description here

此处应默认选择 @Html.DropDownListFor(m => m.provider_service_dtls[i].activity_code_type, (SelectList)@ViewBag.activity_code_type, Model.provider_service_dtls[i].activity_code_type) 。实现同样的改变是什么?

被修改

模型

Internal

编辑模板

public partial class provider_service_dtls
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long service_id { get; set; }

        public long preapproval_id { get; set; }

        public string activity_code_type { get; set; }
        public string activity_type { get; set; }

        public string activity_type_name { get; set; }


        public string activity_code { get; set; }
        public string activity_name { get; set; }
        public string internal_activity_code { get; set; }
        public string internal_activity_name { get; set; }


        [ForeignKey("preapproval_id"), InverseProperty("provider_service_dtls")]
        public virtual provider_preapproval preapproval { get; set; }


    }

查看

在for循环中我编码如下

@model Provider.Models.provider_preapproval
@Html.DropDownListFor(m => m.activity_code_type, (SelectList)ViewData["options"])

我收到错误

  

'System.Web.Mvc.HtmlHelper'确实如此   不包含'EditorFor'的定义和最佳扩展方法   超载   “System.Web.Mvc.Html.EditorExtensions.EditorFor(System.Web.Mvc.HtmlHelper,   System.Linq.Expressions.Expression&gt;中   string,object)'有一些无效的参数

2 个答案:

答案 0 :(得分:2)

不幸的是,@Html.DropDownListFor()在循环中渲染控件时的行为与其他助手的行为略有不同。这已经被报道为CodePlex上的一个问题(不确定它是否是一个错误或只是一个限制)

为集合中的类型创建自定义EditorTemplate

/Views/Shared/EditorTemplates/provider_service_dtls.cshtml中(注意名称必须与类型名称匹配)

@model yourAssembly.provider_service_dtls

@Html.HiddenFor(m => m.service_id)
@Html.DropDownListFor(m => m.activity_code_type, (SelectList)ViewData["options"], "--- Select Activity Code Type ---")
.... // html helpers for other properties of provider_service_dtls

然后在主视图中,将SelectList作为additionalViewData传递给EditorTemplate

@model yourAssembly.provider_preapproval 

@using (Html.BeginForm())
{
  .... // html helpers for other properties of provider_preapproval

  @Html.EditorFor(m => m.provider_service_dtls, new { options = (SelectList)@ViewBag.activity_code_type })
  ...

EditorFor()方法接受IEnumerable<T>,并为集合中的每个项目生成控件

修改

另一种方法是在SelectList循环的每次迭代中创建一个新的for,您需要设置Selected的{​​{1}}属性。这意味着您的SelectList属性必须为ViewBag,而不是IEnumerable<T>,例如在控制器中

SelectList

并在视图中

ViewBag.ActivityCodeTypeList = new[]
{
  new { ID = 1, Name = "Internal" },
  new { ID = 2, Name = "Standard" }
}

答案 1 :(得分:0)

只需使用IEnumerable Model类型列表

即可试用
.Undo

希望它能运作