在没有Viewbag的情况下将List对象传递给MVC中的View

时间:2018-04-06 20:29:42

标签: c# asp.net-mvc razor

这已在这里多次提到,但我找不到合适的解决方案。

我正在尝试使用Viewbag在没有的MVC视图中填充DDL。

这是控制器代码:

public ActionResult Name()
{
     ***
     List<SelectListItem> Items = Model.GetItemList();
     return View("Name");
}

但是,我找不到可用的View语法。我知道我从模型中返回的List包含正确的数据。在视图中我有这个不正确的。如何在视图中访问我的“项目”列表?视图输入很明显。

 @Html.DropDownListFor(n => n.Value,  new SelectList(Items, "Value", "Text"))

2 个答案:

答案 0 :(得分:2)

代码没有经过测试,因此可能会有一些拼写错误,但它应该给你一个大概的想法。

如果您使用的ViewModel具有名为Items的属性,则必须将其传递给视图并将其用作:

public class MyViewModel
{
    string SelectedItem { get; set; }
    List<SelectListItem> Items { get; set; }
}

然后

public ActionResult Name()
{
     ***
     List<SelectListItem> Items = Model.GetItemList();
     var myViewModel = new MyViewModel { Items = Items }
     return View("Name", myViewModel);
}

然后在cshtml中:

// at the start of the file
@model yournamespace.MyViewModel

// somewhere below
@Html.DropDownListFor(n => n.SelectedItem, Model.Items);

答案 1 :(得分:1)

到目前为止提供的答案没有错,但我会给你一个不同的方法。 Bellow你会找到代码来定义任何IE的数量的扩展方法。这些扩展方法将任何列表转换为SelectList:

namespace System
{
    public static class IEnumerableExtensions
    {
        public static SelectList ToSelectList<T>(this IEnumerable<T> items) where T : class
        {
            return new SelectList(items);
        }

        public static SelectList ToSelectList<T>(this IEnumerable<T> items, object selectedValue) where T : class
        {
            return new SelectList(items, selectedValue);
        }

        public static SelectList ToSelectList<T>(this IEnumerable<T> items, string dataValueField, string dataTextField, object selectedValue) where T : class
        {
            return new SelectList(items, dataValueField, dataTextField, selectedValue);
        }

        public static SelectList ToSelectList<T>(this IEnumerable<T> items, string dataValueField, string dataTextField) where T : class
        {
            return new SelectList(items, dataValueField, dataTextField);
        }
    }
}

因为它们是在System命名空间中定义的,所以您可以在代码中的任何位置使用这些方法。您现在可以执行以下操作:

Model.GetItemList().ToSelectList();

Model.GetItemList().ToSelectList("ValueFieldName", "TextFieldName");

现在,您只需将列表作为视图模型的一部分传递:

public class MyViewModel
{
    // Replace T here with your domain model fetched from Model.GetItemList()
    public List<T> Items { get; set; }
}

public ActionResult Name()
{
    // Previous action logic here...
    var myViewModel = new MyViewModel { Items = Model.GetItemList() }
    return View(myViewModel);
}

然后在您的视图中,您现在可以执行此操作:

// Declare your view model at the top of your view
@model yournamespace.MyViewModel

// Define your drop down list.
@Html.DropDownListFor(n => n.Value, Model.Items.ToSelectList());