2012-03-23 73 views
13

另一個關於DropDownListFor的問題沒有選擇「Selected」的值。 這裏是代碼:DropDownListFor - 不選擇「選定」的值

型號:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 
} 

控制器:

[HttpGet] 
[Authorize] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 
    model.Permissions = PermissionsAll(); 
    return View("CreateEditAccount", model); 
} 

在這一點上,如果我把一個破發點上的回油管,將model.Permissions包含適當IEnumerable<SelectListItem>對象有多個項目,只有一個,它有Selected = true

查看:

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

呈現:

<select id="PermissionId" name="PermissionId"> 
    <option value="">-- Select --</option> 
    <option value="1">Permission one</option> 
    <option value="2">Permission two</option> 
</select> 

出於某種原因,沒有對任何的選項和第一個選項沒有選擇的屬性被選中。

任何幫助表示讚賞。


UPDATE

看來它是與此article。總結本文的解決方案,我需要確保屬性名稱(@html.DropDownList的第一個參數)不是與模型的任何現有屬性匹配。 有人可以解釋爲什麼會出現這種情況嗎?

它呈現下拉正確的,當我的觀點是這樣寫的:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions) 

但是,它沒有任何邏輯意義上做到這一點,因爲其實我是想粘結劑能夠匹配選擇元素的名稱到模型屬性。否則,我不得不手動獲取像這樣的值:Request.Form["PermissionIdNotMatching"];

任何人有任何想法?


SOLUTION

見接受的答案,並給它的第一條評論。

+1

PermissionId的值應該等於Select = true的SelectListItem.Value。嘗試model.PermissionId = Convert.ToInt32(lst.First(t => t.Selected).Value); 我也遇到了和你一樣的問題,令人驚訝的是編輯時選擇的值已經被選中,從那裏我發現PermissionId應該具有與所選擇的SelectListItem值相同的值。爲我工作。 – Brij 2013-10-26 05:03:41

回答

8

好吧,讓我們來討論一下你的例子,當PermissionId是int。您發佈了型號爲CreateEditAccountModel的模型以供查看。當你創建這個模型時,PermissionId等於0(int的默認值)。並且DropDownListFor在視圖中獲取此值。因此你沒有選定的值。 當您使用字符串類型時,默認值PermissionId爲空,因此`DropDownListFor作爲SelectList的默認值。

在這種情況下,最好使用int?Nullable<int>類型爲PermissionId

+1

你的解釋是相關的。回過頭來,當我問這個問題時,我不明白'DropDownListFor'將首先計算'PermissionId'的值,如果它不爲null,則會選擇該值。否則它會考慮到'Model.Permissions' – Dmitry 2013-11-12 17:07:37

+0

這可能與可能不會有問題相關,但對於某些人來說可能有用,例如從linq創建一個List 到實體並將Int轉換爲字符串Value make如果您使用SqlFunctions.StringConvert,請務必修剪,因爲它不會爲預選值呈現selected = true。不裁剪導致下拉菜單具有這樣的值:value =「1」。 – 2016-06-17 20:31:17

4

當您使用@Html.DropDownListFor(m => m.PermissionId, Model.Permissions),請確保PermissionId在模型中已經設置 - 即所選擇的項目/ ID。此外,該模型包含 '選擇' 屬性:

var query = DatabaseContexts.Select(
      c => new SelectListItem 
      { 
       Value = c.Key, 
       Text = c.Value, 
       Selected = c.Key == currentUsed 
      }); 

PermissionId = that want to select; 
Permissions = query.AsEnumerable(); 

UPDATE:

這裏是HTTPGET的全樣本:

在HomeController.cs:

[HttpGet] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 

    var permissionsAll = new List<SelectListItem> 
     { 
      new SelectListItem 
       { 
        Value = "", 
        Text = "--please select--", 
        Selected = false 
       }, 
      new SelectListItem 
       { 
        Value = "1", 
        Text = "Permission one", 
        Selected = true 
       }, 
      new SelectListItem 
       { 
        Value = "2", 
        Text = "Permission two", 
        Selected = false 
       } 
     }; 
    model.PermissionId = 1; //add this line 
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere.... 
    return View("EditAccount", model); 
} 

CreateEditAccountModel.cs:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 

} 

EditAccount.cshtml:

@using MvcApplication1.Models 
@model CreateEditAccountModel 
@{ 
    ViewBag.Title = "EditAccount"; 
} 

<h2>EditAccount</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

運行應用程序,默認情況下進入到/ home/editaccount/1,下拉菜單將選擇 「權限」 之一。

我覺得PermissionId的類型必須是「字符串」是,System.Web.Mvc.SelectedListItem.Value是「字符串」

如果當用戶在下拉列表中選擇的項目,你想做些什麼,你可能需要[HttpPost]。

BTW:this link對您有幫助嗎?

+0

PermissionId是實際設置的。我最初從模型中複製了一組錯誤的屬性。請再次查看。控制器中的 – Dmitry 2012-03-23 08:35:39

+0

:CreateEditAccountModel model = new CreateEditAccountModel(); model.Permissions = PermissionsAll(); model.PermissionId = 1;/*選擇ID */ 返回查看(「CreateEditAccount」,model);在視圖中:@ Html.DropDownListFor(m => m.PermissionId,Model.Permissions); – xoyoja 2012-03-23 13:59:14

+0

xoyoja,你爲什麼要爲它在HttpGet上賦值?在任何情況下,變量值都不應該影響下拉列表,因爲它只是一個將保存選定值的變量。我仍然嘗試過,並沒有幫助。感謝您的嘗試! – Dmitry 2012-03-23 17:07:26