私は2つのページを持っています:
- データ注釈の検証を使用するページを作成します。
- ページを編集します。
両方のページで異なるモデルを使用しています。選択した行の値を表示するには、編集ページに特定のモデルを使用する必要があります。方法:
- 同じ検証を使用するように編集コントローラーを取得する、または
- 作成ページと同じモデルを使用する場合、編集ページに現在の行の値を表示しますか?
例えば:
私の作成ページ:
@model Test.Models.NewPerson
@using (Html.BeginForm())
{
@Html.ValidationSummary(true, "Failed. Please fix the errors.")
<div class="editor-label">
@Html.LabelFor(m => m.FirstName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.LastName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
<input type="submit" value="Submit" />
}
私のモデル:
public class NewPerson
{
[Required(ErrorMessage = "*")]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "*")]
[Display(Name = "Last name")]
public string LastName { get; set; }
}
次に、私の編集ページ:
@model Test.Person
using (Html.BeginForm())
{
@Html.ValidationSummary(true, "Please fix the errors below.")
<div class="editor-label">
@Html.LabelFor(m => m.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
<input type="submit" value="Update" />
}
編集
私のコントローラーの編集アクションには、次のものがあります。
var context = new MyContext();
var person = context.Person.Single(m => m.ID == id);
if (Request.IsAjaxRequest())
{
return PartialView("Edit", person);
}
return View(person);
その関数にブレークポイントを設定すると、var person の結果が表示されます。ただし、ビューには何も返されません。なぜだめですか?
編集
アクションのコードは次のとおりです。
[HttpPost]
public ActionResult Create(NewPerson model)
{
if (ModelState.IsValid)
{
string UID = Membership.GetUser().ProviderUserKey.ToString();
System.Guid myUID = System.Guid.Parse(UID);
using (var context = new MyContext())
{
Person newPerson = new Person();
newPerson.UserId = myUID;
newPerson.FirstName = model.FirstName;
newPerson.LastName = model.LastName;
context.Person.AddObject(newPerson);
context.SaveChanges();
}
}
編集アクション:
[HttpGet]
public ActionResult Edit(int id)
{
var context = new MyContext();
//recently edited: accidentally had "camper" instead of "person"
var person = context.Person.Single(m => m.ID == id);
if (Request.IsAjaxRequest())
{
return PartialView("Edit", person);
}
return View(person);
}
そして私の見解:
@foreach (var person in Model)
{
@Html.DisplayFor(modelItem => person.LastName), @Html.DisplayFor(modelItem => person.FirstName)
@Html.ActionLink("Edit", "Edit", new { id = person.ID }, new { @class = "openDialog",
data_dialog_id = "emailDialog", data_dialog_title = "Edit Person" })
}