2012-07-30 79 views
3

我想根據我的後端數據設置「selected」選項。這裏是我的代碼示例...如何在cshtml(剃鬚刀)上設置屬性?

<select id="listName" name="listName"> 
    <option>Select Name</option> 
     @foreach (var item in ViewBag.NameList as Dictionary<string, string>) 
     {     
      //worked in MVC2, not with razor 
      <option value= '@item.Key' @if (TempData["name"].ToString() == item.Key) { selected = "&quot;selected&quot;"); }>@item.Value - @item.Key</option> 

      string nameSelect = TempData["name"].ToString() == item.Key ? "selected" : ""; 
      <option value= '@item.Key' selected= '@nameSelect'>@item.Value - @item.Key</option>       
     } 
</select> 

有沒有更好的方法來做到這一點?

+3

呃,這是什麼? Html.DropDownListFor怎麼樣?如何查看模型? – 2012-07-30 15:26:36

+2

請參閱此[相關SO帖子](http://stackoverflow.com/a/7693791/175679)。 – SliverNinja 2012-07-30 15:27:46

回答

5

有沒有更好的方法來做到這一點?

哦,是的。當然使用視圖模型。所以,讓我們定義一個視圖模型:

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

然後控制器動作,將來自數據源填充這個視圖模型:

public ActionResult SomeAction() 
{ 
    var model = new MyViewModel(); 

    // preselect an item with Value=2 
    model.SelectedValue = "2"; 

    // this could of course come from a database or something 
    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, "Select") 

既然你在你的問題中顯示了一些字典,我們可以假設你已經有這個字典。在您的例子您在ViewBag塞進(這是錯誤的),但你可以把它綁定到視圖模型:

public ActionResult SomeAction() 
{ 
    Dictionary<string, string> values = ...... 

    var model = new MyViewModel(); 
    model.SelectedValue = (string)TempData["name"]; 
    model.Values = values.Select(x => new SelectListItem 
    { 
     Value = x.Key, 
     Text = string.Format("{0} {1}", x.Key, x.Value) 
    }); 

    return View(model); 
} 

這是ASP.NET MVC:強類型,視圖模型,沒有ViewBag。

+0

我的前端開發人員,只編寫html代碼,發現如果我們這樣編寫代碼很困難 – 2012-07-30 15:49:19

+0

您的前端開發人員是否知道CSS?如果他們這樣做(如果他們自稱前端開發人員應該這樣做),那麼只需將CSS類別分配給下拉列表即可:@ Html.DropDownListFor(x => x.SelectedValue,Model.Values,「Select」,new {@class =「values」})'然後給你的前端開發者.value類。這是一種絕對的**犯罪**來編寫ASP.NET MVC視圖的方式。所以如果你想以正確的方式來完成ASP.NET MVC,你應該考慮使用視圖模型。否則,你會遭受很多。此代碼是絕對維護的噩夢。 – 2012-07-30 15:49:46

+0

他們不知道'@ Html.DropDownListFor'有重載,'new {@class =「values」}'有點遠離html。是的,你是對的,我在想這個噩夢,並沒有找到一個完美的解決方案,前端開發人員不需要學習額外的C#語法 – 2012-07-30 15:59:29

2

除了@Html.DropDownListFor,你可以像這樣的代碼:

<option value= '@item.Key' @(TempData["name"].ToString() == item.Key ? "selected" : "")>@item.Value - @item.Key</option> 

順便說一句,我不喜歡@ Html.DropDownListFor ..

+0

他們對我所做的事情都是很好的答案,但作爲一名新手開發人員,我正試圖用我的代碼清理乾淨。感謝allentranks和@Dimitrov的洞察力。 – MrM 2012-07-30 17:27:25