ASP.NET MVC:如何手动在视图的下拉列表中设置所选项?

时间:2011-04-06 16:07:36

标签: asp.net asp.net-mvc

我有一个由许多记录组成的视图。每个记录都有一个相应的表单来编辑其隐藏的详细信息,直到用户按下Edit,此时显示表单并可以使用Ajax发布以保存更改。

每个记录都有一个类别(另一个表的外键)。类别列表取自viewmodel,它是一个SelectList。因此,一个SelectList of Categories,它提供多种形式(每个记录一个)

基本上,在我的循环中,渲染出我的记录列表,我希望编辑表单选择正确的类别。虽然Html.DropDownList没有允许你设置所选项的重载 - 但是这必须在创建SelectList时完成 - 我只在ViewModel中执行一次。

我错过了一招吗? 我的代码:

<div class="form-row">
            <label for="Category">
                File Category</label>
            <%= Html.DropDownList("CategoryID", Model.Categories, new { style="font-size:11px; width:150px;" })%>
        </div>

我想根据记录的值

传递所选项目

谢谢,

EDIT 包含更多代码,以便更有意义: ViewModel的一部分,用于向视图提供数据:

public class CustomerFilesViewModel
{
    public List<CustomerFile> Files { get; set; }
    //added for the manage files area of the site
    public SelectList Organisations { get; set; }
    public int PDFS { get; set; }
    public int DOCS { get; set; }
    public int JPGS { get; set; }
    public double Quota { get; set; }
    public double TotalFiles { get; set; }
    public int SpreadSheets { get; set; }
    public SelectList Categories { get; set; }
...............

在我看来,我然后遍历文件并为每个文件创建一个编辑表单。我使用ViewModel中的SelectList填充DropDownnn类别。我希望能够使用file.CategoryID在循环中设置所选项目。

2 个答案:

答案 0 :(得分:2)

在渲染此视图的控制器中,如果要预先选择ViewData["CategoryID"] = "5";选项,则需要设置value="5"。当然使用ViewData并不是我推荐你的。您应该使用视图模型:

var model = new SomeViewModel();
model.CategoryID = "5";
model.Categories = ...
return View(model);

然后:

<%= Html.DropDownListFor(
    x => x.CategoryID, 
    Model.Categories, 
    new { style="font-size:11px; width:150px;" }
)%>

更新:

为@Robert Koritnik提供了一个完整的例子,他在评论部分对此解决方案表示了一些疑问:

型号:

public class MyViewModel
{
    public string Id { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

控制器:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // we want the second item preselected
        // so assign our view model property
        // which will be used to bind the dropdown list
        // to the id of the corresponding item in the options collection
        Id = "2",
        Items = new[]
        {
            new SelectListItem { Value = "1", Text = "item 1" },
            new SelectListItem { Value = "2", Text = "item 2" },
            new SelectListItem { Value = "3", Text = "item 3" },
        }
    };
    return View(model);
}

查看:

@Html.DropDownListFor(
    x => x.Id,
    new SelectList(Model.Items, "Value", "Text"),
    "-- Please select an item --"
)

正如预期的那样,第二项是预先选定的。

备注:Items属性可以是任何自定义类型的IEnumerable,只需在视图中构建SelectList时指定相应的Value和Text属性。

答案 1 :(得分:0)

客户端

您正在按需显示此编辑器,对吗?所以你说。所以你已经使用Javascript来显示这个编辑器表单。你为什么不选择正确的类别呢?您可以使用可用于选择正确类别的其他属性呈现修改链接或按钮。

<%= Html.ActionLink("edit", "action", "controller", new { categoryId = item.Id })  %>

我非常希望你只使用一个编辑器和每个记录一个,因为所有记录都可能是相同的。它们只包含不同的数据。只使用一个编辑器就可以这样工作:

  1. 用户点击修改
  2. 您将阅读记录的数据并填充编辑器字段(也选择正确的类别)
  3. 显示编辑器
  4. 第二步可能很棘手。我通常将记录的数据作为JSON字符串放在包含元素的记录中(如果此记录中有许多操作,那么它们都可以使用相同的JSON)

    示例:

    ...
    <tr data='<%= item.ToJson() %>'>
        <td><%= item.Name %></td>
        ...
        <td><%= Html.ActionLink("edit", "action", "controller", new { @class="edit-action" }) %>
    </tr>
    ...
    

    您可以在ToJson类型上编写自己的扩展方法object,它将返回表示模型对象实例的字符串。

    反正。操作链接应具有正确的控制器和操作,以便稍后发送编辑数据。但主要的是你的sclient脚本会以这种方式工作:

    $(".edit-action").click(function(evt){
        evt.preventDefault();
        var ctx = $(this);
        var itemData = $.parseJSON(ctx.closest("[data]").attr("data"));
        var editor = $("#YourEditorSelector");
        // populate editor's fields and then
        editor.show();
    });
    

    瞧。  为了这个编辑器,我使用jQuery.tmpl()插件(jQuery的正式部分),因此填充表单要容易得多。实际上,当用户点击编辑时,您可以根据需要创建它,并且会预先填充正确的数据(并且将根据需要选择下拉列表)。

    服务器端

    您应该将视图中的类别转换为能够设置所选项目的SelectList