我有一个由许多记录组成的视图。每个记录都有一个相应的表单来编辑其隐藏的详细信息,直到用户按下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
在循环中设置所选项目。
答案 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 }) %>
我非常希望你只使用一个编辑器和每个记录一个,因为所有记录都可能是相同的。它们只包含不同的数据。只使用一个编辑器就可以这样工作:
第二步可能很棘手。我通常将记录的数据作为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
。