C# MVC 3在视图中使用带有选定值的selectlist

34 浏览
0 Comments

C# MVC 3在视图中使用带有选定值的selectlist

我正在开发一个MVC3的Web应用程序。我希望在编辑文章时,在应用程序管理系统中显示一个类别列表。在我的视图模型中,我为类别的选择列表项定义了以下属性。

/// 
/// 类别列表
/// 
[Display(Name = "类别")]
public IEnumerable Categories { get; set; }

下一步,我的控制器包含以下编辑操作,其中选择列表项从数据库中填充。

public ActionResult Edit(Guid id)
{
    var blogToEdit = _blogService.First(x => x.Id.Equals(id));
    var listOfCategories = _categorieService.GetAll();
    var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList();
    selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem});
    var viewModel = new BlogModel
                        {
                            BlogId = blogToEdit.Id,
                            Active = blogToEdit.Actief,
                            Content = blogToEdit.Text,
                            Title = blogToEdit.Titel,
                            Categories = selectList //在这一点上,我看到了预期的项目被选中
                            //Categories = new IEnumerable(listOfCategories, "Id", "Naam", blogToEdit.CategorieId)
                        };
    return View(viewModel);
}

当我在返回视图之前设置断点时,我看到选择列表按照我预期的填充。所以在这一点上一切似乎都没问题。视图模型被完全正确地填充了。

然后在我的视图中(我使用Razor),我有以下两个规则,用于呈现选择列表。

@Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId)
@Html.ValidationMessageFor(m => m.Categories)

当我运行代码并打开编辑博客的视图时,我可以看到所有正确的数据。选择列表也正确地呈现出来,但是我希望被选中的项目失去了选择。这怎么可能?直到视图模型与视图一起返回的那一点,一切都还好。但当我在浏览器中查看网页时,选择列表只有没有正确的选择。我在这里漏掉了什么?或者做错了什么?

0
0 Comments

问题出现的原因是在使用C# MVC 3中的SelectList时,如果在ViewData中存在冲突的值,可能会导致selected=true属性无法正常工作。

解决方法是在使用SelectList时,确保ViewData中不存在与之冲突的值。这样可以保证selected=true属性能够正常工作。

示例代码如下所示:

// Controller
public ActionResult Index()
{
    // 假设ViewData中存在冲突的值
    ViewData["ConflictValue"] = "conflict";
    // 创建SelectList,确保与冲突值不匹配
    var selectList = new SelectList(new[]
    {
        new SelectListItem { Value = "value1", Text = "Text 1" },
        new SelectListItem { Value = "value2", Text = "Text 2" },
        new SelectListItem { Value = "value3", Text = "Text 3" }
    }, "Value", "Text", "value2");
    // 将SelectList传递给View
    return View(selectList);
}
// View
@model SelectList

通过以上方法,我们可以解决C# MVC 3中使用SelectList时可能出现的selected=true属性无法正常工作的问题。

0
0 Comments

问题的原因是在使用DropDownListFor方法时,第一个参数必须是视图模型中的属性,该属性将包含当前选定的值。它应该是一个标量属性,而不是一个集合。

解决方法是在视图模型中添加一个这样的属性,并在控制器动作中设置选定的值。具体代码如下:

[Display(Name = "Categorie")]
public IEnumerable Categories { get; set; }
public string CategoryId { get; set; }

var selectList = listOfCategories.Select(x => new SelectListItem {
    Text = x.Name, 
    Value = x.Id.ToString() 
}).ToList();
var viewModel = new BlogModel
{
    BlogId = blogToEdit.Id,
    Active = blogToEdit.Actief,
    Content = blogToEdit.Text,
    Title = blogToEdit.Titel,
    Categories = selectList,
    CategoryId = blogToEdit.Category.Id 
};

在视图中使用DropDownListFor方法,将选定的值绑定到属性CategoryID上:

.DropDownListFor(x => x.CategoryId, Model.Categories)

最后,有读者指出在创建selectList时遇到了错误。解决办法是将categories.ToList()放在前面,然后再使用Select方法创建selectList,因为第一个LINQ查询无法解析到数据库。

以上就是关于在C# MVC 3中使用SelectList并设置选定值的问题的原因和解决方法。

0