名前(一意かつ必須)パスワード(必須)およびプロフィール(必須)。プロファイルクラスには固有の名前が必要な名前があります。どちらのクラスも、最初にコードを使用してデータベースを生成する際に主キーとして機能するIDを持っています。エンティティAはエンティティBに依存し、エンティティBのすべての情報をエンティティAのPOST作成メソッドにMVCコードを使用して送信する方法
私は私のページで、新規ユーザーを作成できるようにしたい、ここでこれを行うにはいくつかのコードは次のとおりです。
コントローラ
// GET: Users/Create
public ActionResult Create()
{
populateViewBagWithProfilesAsSelectListItem();
return View();
}
private void populateViewBagWithProfilesAsSelectListItem()
{
IEnumerable<SelectListItem> profiles = db.Profiles.ToList().
Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
ViewBag.Profiles = profiles;
}
// POST: Users/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Name,Password,Profile")] User user)
{
user.Profile = db.Profiles.Find(user.Profile.Id);
ModelState.Clear();
TryValidateModel(user);
lock (UsersLocker)
{
if (ModelState.IsValid)
{
db.Users.Add(user);
db.SaveChanges();
return RedirectToAction("Index");
}
}
populateViewBagWithProfilesAsSelectListItem();
return View(user);
}
ビュー
@model ProceduresRecord.Web.MVC.Models.User
@{
ViewBag.Title = "Crear";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Usuario</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Profile, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Profile.Id, (IEnumerable<SelectListItem>)ViewBag.Profiles, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Profile.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Crear" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Volver a la Lista", "Index")
</div>
を作成します。このページの結果:
あなたは、私がデータベースからプロファイルを読み込む見ることができるように、彼は1をピックアップし、そのプロファイルのIDはPOSTメソッドに送信され、作成上のクリックした後は、私は、ユーザーにプロファイル名が表示さで作成しますコントローラ。それから、私は提供されたIDを使用してデータベースから完全なプロファイルを取得するために苦労し、ユーザーに完全なプロファイルを割り当て、ModelStateを検証します(実際に変更されるように...プロファイルに名前がない今まで)。 それはすべて動作するようですが、私は不思議に思っていた...
これを行うには良い方法はありませんか?私は一発でPOSTにプロフィールを送信し、このコードを避けるためにできることは素晴らしいではないでしょう、選択したHTMLを取り込むとき、私はすでにデータ・ベースからプロファイルを得た、意味:
user.Profile = db.Profiles.Find(user.Profile.Id);
ModelState.Clear();
TryValidateModel(user);
場合何らかの方法があります、教えてください!
P.D:私はMVCとコードファーストを自分で学習しようとしていますが、アドバイスをいただければ幸いです。
特に編集時に、ビューでデータモデルを使用しないでください。 'Name'、Password'、' SelectedProfile'のプロパティを表示するモデルを作成します - CodingYoshiの回答を参照してください(質問の最後の3行は必要ありません) –