簡體   English   中英

下載MVC

[英]Dropdown in MVC

在我的MVC應用程序中,我需要添加一個顯示域名列表的下拉列表。

我已經有一個包含多個屬性的ViewModel。 我不確定步驟的順序應該是什么:

  1. 將新屬性添加到我的ViewModel 應該是什么類型? 名單?
  2. 定義使用值填充上述屬性的方法。
  3. 在視圖中使用該屬性? 使用HTML.DropdownFor

我知道我應該在我的問題中加入一些代碼,但是現在我很難開始這個...

編輯:向ViewModel添加以下屬性:

 public IEnumerable<SelectListItem> DomainList { get; set; }

並實現了一個返回域列表的方法:

internal static List<Domain> FetchAllDomains()

接下來在我的控制器動作中,我有:

var domains = FetchAllDomains().Select(d => d.DomainName);
return new EmailModel() {DomainList = domains };

但是我收到以下錯誤:

無法將類型'System.Collections.Generic.IEnumerable'隱式轉換為'System.Collections.Generic.IEnumerable'。 存在顯式轉換(您是否錯過了演員?)

1)向我的ViewModel添加一個新屬性? 應該是什么類型? 名單?

您需要2個屬性才能更精確: IEnumerable<SelectListItem>用於保存所有可用選項,標量屬性用於保存選定值

2)定義一個用值填充上述屬性的方法。

是。

3)在視圖中使用該屬性? 使用HTML.DropdownFor?

不,不在視圖中。 視圖不會調用任何方法。 視圖適用於視圖模型。 控制器有責任將正確填充的視圖模型傳遞給視圖。

例如:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }

    ... some other properties that your view might need
}

然后是一個控制器動作,它將填充此視圖模型:

public ActionResult Index()
{
    var model = new MyViewModel();
    model.Values = 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);
}

最后是強類型視圖,您將在其中顯示下拉列表:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)

更新:

根據您更新的問題,您在視圖模型上有一個IEnumerable<SelectListItem>屬性,您嘗試為其指定IEnumerable<string>類型的值,這顯然是不可能的。 您可以將此轉換為IEnumerable<SelectListItem>如下所示:

var domains = FetchAllDomains().Select(d => new SelectListItem
{
    Value = d.DomainName,
    Text = d.DomainName
});
return new EmailModel { DomainList = domains };

如果您不介意,我會向您展示一個示例考試列表

public class SomeClass
{
    //Properties

    public int ExamId { get; set; }
    public SelectList ExamList { get; set; }
}

幫手:

public static void PopulateExamList(MarkEditViewModel model,
    List<Exam> examList)
{
    model.ExamList = new SelectList(examList, "Id", "ExamName");
}

在我的示例中,您必須添加所有考試的標記。 在View中,您將獲得一個考試下拉列表
和View(預測模型中的每個元素):

@Html.DropDownListFor(model => model.ExamId,
                                        Model.ExamList,
                                        "Choose exam")

一旦你的控制器上的列表將其傳遞給視圖(作為模型或使用ViewBag),然后使用幫助器:

Html.DropDownList(
    string name,
    IEnumerable<SelectListItem> selectList,
    string optionLabel,
    object htmlAttributes) 

或者(MVC 3)

@Html.DropDownListFor(model => model.Property.ID,
    new SelectList(model.PropertyList, "ID", "Type"))

在您的ViewModel中

public class ViewModelClass
{
    public string DomainName { get; set; }

    public IEnumerable<SelectListItem> DomainList
    {
        get
        {
            return GetDomainNames()  //your method to get domain names
             .Select(d => new SelectListItem() { Text = d, Value = d });
        }
    }
}

你的強類型視圖

@model ViewModelClass

@Html.DropDownListFor(model => model.DomainName, Model.DomainList)
  1. 是的,您需要模型中的屬性來處理DropDownList的值
  2. 取決於,通常可以是指向DropDownlist的值的Integer。您將用於填充元素的List可以定義為ViewBag中的元素,或模型中的Another Attribute
  3. 剃刀語法完全取決於您嘗試實現的內容應該使用@Html.DropDownListFor()引用模型的屬性以保證視圖是@Html.DropDownListFor()

您處於正確的軌道,ViewModel中有2個屬性。 一個用於保存UI中所選項目ID的項目列表和其他項目

public class ProductViewModel
{
    public IEnumerable<SelectListItem> Items { get; set; }
    public string SelectedItemId { get; set; }
    //Other Properties
}

在Get Action方法中,返回包含數據的ViewModel

 public ActionResult Index()
 {
    var objProduct = new ProductViewModel();
    objProduct.Items = new[]
    {
          new SelectListItem { Value = "1", Text = "Domain 1" },
          new SelectListItem { Value = "3", Text = "Domain 2" },
          new SelectListItem { Value = "3", Text = "Domain 3" }
    };
    // can replace the above line with loading data from Data access layer.
    return View(objProduct);
}

並在您的視圖中強烈鍵入ProductViewModel

@model ProductViewModel
@using (Html.BeginForm())
{ 
  @Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..")
  <input type="submit" value="save" />
}

在您的HTTPpost操作中,您將獲得所選的值

[HttpPost]
public ActionResult Index(ProductViewModel model)
{
 //  check model.SElectedItemId here

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM