ドロップダウン リストの方がはるかに適切と思われる場合、これは確かに奇妙な要件ですが、これまでにも奇妙な要件がありました。:) これを機能させるために知っておくべきことをうまく説明できる簡単な例を次に示します。
まず、国名を ID に関連付ける単純なモデル:
public class CountryModel
{
public int Id { get; set; }
public string Country { get; set; }
}
今コントローラー:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(string country)
{
var countryId = GetCountries()
.Where(c => c.Country.ToLower() == country.ToLower())
.Select(c => c.Id)
.SingleOrDefault();
if (countryId != 0)
return RedirectToAction("Thanks");
else
ModelState.AddModelError("CountryNotSelected", "You have selected an invalid country.");
return View();
}
private List<CountryModel> GetCountries()
{
return new List<CountryModel>
{
new CountryModel { Id = 1, Country = "Russia" },
new CountryModel { Id = 2, Country = "USA" },
new CountryModel { Id = 3, Country = "Germany" }
};
}
}
ビューは次のとおりです。
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(false)
<fieldset>
<div class="editor-field">
@Html.TextBox("Country")
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
ここで注意すべき点がいくつかあります。まず、このビューに追加のプロパティがあることを既に述べました。その場合、CountryViewModel
単純に文字列にバインドするのではなく、モデルを HTTP POST メソッドのインスタンスにバインドします。したがって、次のようなものです。
public class CountryViewModel
{
public string SomeValue { get; set; }
public string SomeMoreFormData { get; set; }
public string Country { get; set; }
}
ここから、POST メソッドは次のように変更されます。
[HttpPost]
public ActionResult Index(CountryViewModel viewModel)
{
var countryId = GetCountries()
.Where(c => c.Country.ToLower() == viewModel.Country.ToLower())
.Select(c => c.Id)
.SingleOrDefault();
if (countryId != 0)
return RedirectToAction("Thanks");
else
ModelState.AddModelError("CountryNotSelected", "You have selected an invalid country.");
return View(viewModel);
}
次に、 を介して国のリストを作成する方法に注目してGetCountries()
ください。これにより、後でこれを簡単にリファクタリングして、要件が変更された場合にデータベースから国のリストを取得できます。