ステップ1:
ドロップダウンを使用して会社の場所を表示しています。リストはLocationテーブルから取得されます。
ステップ2:
ユーザーが登録している間、ドロップダウンリストに問題の場所が表示されます。
ユーザーがインドを選択すると、この値(場所の名前)がUserLoginテーブルに保存されます。
ASP.Net MVC 3のドロップダウンから値を読み取るにはどうすればよいですか?
ステップ1:
ドロップダウンを使用して会社の場所を表示しています。リストはLocationテーブルから取得されます。
ステップ2:
ユーザーが登録している間、ドロップダウンリストに問題の場所が表示されます。
ユーザーがインドを選択すると、この値(場所の名前)がUserLoginテーブルに保存されます。
ASP.Net MVC 3のドロップダウンから値を読み取るにはどうすればよいですか?
フォームのViewModelを作成します
public class CompanyViewModel
{
public int CompanyId { set;get;}
// Other properties of Company
public int SelectedLocationId { set;get;}
public IEnumerable<Location> Locations { set;get;}
}
このようなLocationクラスがあると仮定します
public class Location
{
public int Id { set;get;}
public string Name { set;get;}
}
Register(HTTPGET
)アクションメソッドで、データベースからビューに場所が入力されたCompanyViewModelオブジェクトを返します
public ActionReuslt Register()
{
CompanyViewModel model=new CompanyViewModel();
model.Locations =myRepositary.GetAllLocations();
return View(model);
}
GetAllLocations
リポジトリからLocationオブジェクトのリストを返すと仮定します。
そして、CompanyViewModelに強く型付けされたレジスタービューで
@model CompanyViewModel
@using(Html.BeginForm())
{
@Html.DropDownListFor(x=>x.SelectedLocationId,
new SelectList(Model.Locations ,"Id",
"Name"),"Select Location")
<input type="submit" value="Save" />
}
HTTPPost
次に、フォームの投稿を処理するactionmethodを記述します(ユーザーがフォームを送信したとき)
[HttpPost]
public ActionResult Register(CompanyViewModel model)
{
if(ModelState.IsValid)
{
// You will have selected Location id available in model.SelectedLocationId property now
//Save and redirect.
}
//Model Validation failed. so Let us reload the locations again
//because HTTP is stateless and ASP.NET MVC is true to HTTP ! :)
model.Locations =myRepositary.GetAllLocations();
return View(model);
}
シナリオで変更して使用できるサンプルコードを次に示します。あなたのコードがどのように見えるかわからないので、私は自分のコードを作成しました。
あなたの見解では:
@model YourProject.ViewModels.YourViewModel
あなたの場所のドロップダウン:
<td><b>Location:</b></td>
<td>
@Html.DropDownListFor(
x => x.LocationId,
new SelectList(Model.Locations, "Id", "Name", Model.LocationId),
"-- Select --"
)
@Html.ValidationMessageFor(x => x.LocationId)
</td>
ビューモデル:
public class YourViewModel
{
// Partial class
public int LocationId { get; set; }
public IEnumerable<Location> Locations { get; set; }
}
アクションの作成方法:
public ActionResult Create()
{
YourViewModel viewModel = new YourViewModel
{
// Get all the locations from the database
Locations = locationService.FindAll().Where(x => x.IsActive)
}
// Return the view model to the view
// Always use a view model for your data
return View(viewModel);
}
[HttpPost]
public ActionResult Create(YourViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Locations = locationService.FindAll().Where(x => x.IsActive);
return View(viewModel);
}
// If you browse the values of viewModel you will see that LocationId will have the
// value (unique identifier of location) already set. Now that you have this value
// you can do with it whatever you like.
}
あなたのロケーションクラス:
public class Location
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
これは簡単です。これがお役に立てば幸いです:)
アップデート:
私のサービスレイヤーは、さらなるビジネスロジックのために存在し、データベースからデータを取得するためにリポジトリレイヤーを呼び出します。最初にEntityFrameworkコードを使用します。IoCコンテナにもAutofacを使用しています。
サービスレイヤー:
public class LocationService : ILocationService
{
private readonly ILocationRepository locationRepository;
public LocationService(ILocationRepository locationRepository)
{
this.locationRepository = locationRepository;
}
public IEnumerable<Location> FindAll()
{
return locationRepository.FindAll();
}
}
そしてあなたのリポジトリ:
public class LocationRepository : ILocationRepository
{
YourDbContext db = new YourDbContext();
public IEnumerable<Location> FindAll()
{
return db.Locations.OrderBy(x => x.Name);
}
}
データベースコンテキストクラス:
public class YourDbContext : DbContext
{
public DbSet<Location> Locations { get; set; }
}
formcollectionを渡す場合、フォームの値を取得する方法によって異なります。これにより、フォームの値にアクセスできます。
public ActionResult MyAction (FormCollection form)
{
string value = form["DropDownListName"];
}
または、次の方法でアクセスできます
string value = Request.Form["DropDownListName"];