如何使用自定义数据类型的@ Html.DropDownListFor

时间:2013-07-01 12:16:45

标签: asp.net-mvc asp.net-mvc-4 razor html.dropdownlistfor

我有以下型号&在视图中简单下拉。我想在下拉列表中填写客户名称。我尝试了下面的代码但它没有用,任何人都可以对这段代码有什么不妥。

模型

 public class customer
{

public int id { get; set; }
public string name { get; set; }
public string address { get; set; }

  }

//////////////////////////

    @{
   Layout = null;
   }

    @model IEnumerable<MvcApplication1.customer>

      <!DOCTYPE html>

        <html>
    <head>
       <meta name="viewport" content="width=device-width" />
      <title>Index</title>
   </head>
         <body>
      <div>

 @Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name"));

        </div>

3 个答案:

答案 0 :(得分:2)

在您尝试这样做时,您犯了一些基本错误。首先尝试了解MVC中幕后的内容以及这些关键词的含义。

您已定义

@model IEnumerable<MvcApplication1.customer>

然后你有以下代码

@Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name"));

此处,您的m表示您已初始化为IEnumerable<MvcApplication1.customer>的@模型。您正在尝试访问IEnumerable(m => m.name)中名为name的属性,而IEnumerable没有此属性。如果您出于某种原因想要访问您的模型,则@model应该是Customer对象。然后,您可以像@Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name"));

一样访问它

在评论中,您已经说过这段代码@Html.DropDownList("name", new SelectList(Model, "id", "name"));运行正常。是的,它之所以有效,是因为您正在使用标识"name"创建一个新的html select元素,并将Model中的所有内容列为选择选项。

好的,足够的解释。

这是我建议您解决问题的解决方案。

在您的控制器操作中,按如下方式实现代码流。

var dropdownDataList = //select your data from the database or any place as a list;

var dropdownOptions = dropdownDataList.Select(d => new {
    id = d.valueforid,
    name = d.valueforname
});

ViewBag.DropdownListOptions = new SelectList(dropdownOptions, "id", "name");

return View();

现在在您看来,请执行以下操作。

@{
    Layout = null;
}

@model MvcApplication1.customer

<!DOCTYPE html>

<html>
    <head>
       <meta name="viewport" content="width=device-width" />
       <title>Index</title>
    </head>
    <body>
        <div>
            @Html.DropDownListFor(m=>m.name, (SelectList)ViewBag.DropdownListOptions)
        </div>
    </body>
</html>

尝试在MSDN中阅读这些文章。 http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx

希望这会有所帮助。

干杯, Amila

答案 1 :(得分:2)

Stack Overflow上的这个问题上有很多样本。我之前已多次回答。

使用视图模型在视图上表示您的数据,不要将您的域对象传递给视图。视图模型具有视图所需的属性,在这种情况下,我只会使用下拉客户。

您的视图模型可能如下所示:

public class CustomerViewModel
{
     public int CustomerId { get; set; }

     public IEnumerable<Customer> Customers { get; set; }
}

您的客户类:

public class Customer
{
     public int Id { get; set; }

     public string Name { get; set; }
}

你的控制器:

public class CustomerController : Controller
{
     private readonly ICustomerRepository customerRepository;

     public Customer(ICustomerRepository customerRepository)
     {
          this.customerRepository = customerRepository;
     }

     public ActionResult Create()
     {
          CustomerViewModel viewModel = new CustomerViewModel
          {
               Customers = customerRepository.GetAll()
          };

          return View(viewModel);
     }
}

您的观点:

@model YourProject.ViewModels.Customers.CustomerViewModel

@Html.DropDownListFor(
     x => x.CustomerId,
     new SelectList(Model.Customers, "Id", "Name", Model.CustomerId),
     "-- Select --"
)
@Html.ValidationMessageFor(x => x.CustomerId)

我希望这会有所帮助。

答案 2 :(得分:0)

试试这个 将您的模型更改为此类

public class customer
{

public int id { get; set; }
public string SelectedName { get; set; }
 public IEnumerable<SelectListItem> Names { get; set; }
public string address { get; set; }

  }

在控制器中

[HttpGet]
public ActionResult Customer()
{
  var names=//collect names from database
  var model = new Customer
    {
       Names = names.Select(m=> new SelectListItem
         {
            value = m.whatever value you want to get(probably Id)
            text = m.name you want to display
         })
    };
    return View(model);
}

并在视野中

@model MvcApplication1.customer
@Html.DropDownListFor(model => model.SelectedName, Model.Names)