Я бы предложил вам использовать строго типизированные виды (не нужно ViewData
и магические строки). не Как всегда начинается с определения вашего вида модели класса:
public class CountriesViewModel
{
public int? SelectedCountryId { get; set; }
public IEnumerable<SelectListItem> Countries { get; set; }
}
Затем контроллер:
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
// TODO: Fetch those from your DB
var countries = new[]
{
new { Id = 1, Name = "Country 1" },
new { Id = 2, Name = "Country 2" },
};
var model = new CountriesViewModel
{
Countries = new SelectList(countries, "Id", "Name", id)
};
return View(model);
}
}
И, наконец, ваш сильно типизированной:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.CountriesViewModel>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%= Html.DropDownListFor(
x => x.SelectedCountryId,
Model.Countries,
"-- Select Country --")
%>
</asp:Content>
Теперь, когда вы звоните /home/index
вы получаете не выбрана страна, но когда вы передаете id
этому действию, например /home/index/2
, вы получаете страну с выбранным идентификатором.
Примечание: Если вы используете ASP.NET MVC 1.0 не будет иметь сильно типизированных помощника DropDownListFor, и вы могли бы использовать это вместо того, чтобы:
<%= Html.DropDownList(
"SelectedCountryId",
Model.Countries,
"-- Select Country --")
%>
Возможный дубликат: http://stackoverflow.com/questions/624828/asp-net-mvc-html-dropdownlist-selectedvalue – Gabe