私は MVC を初めて使用するので、NerdDinner チュートリアル (こちら) に取り組んでいます。特に、チュートリアルのパート 5 で説明されている UpdateModel メソッドの使用で問題が発生しています。問題は、UpdateModel メソッドを使用してディナー オブジェクトの値を編集しようとすると、値が更新されず、例外がスローされないことです。
奇妙なことに、チュートリアルに示されている作成または削除機能に問題はありません。更新機能だけが機能していません。
以下に、私が使用しているコントローラー コードと、aspx ビュー ファイルと ascx 部分ビュー ファイルの両方に含まれるビュー マークアップを含めます。
以下は、DinnerController.cs と呼ばれるコントローラー内のコードです。
//
// GET: /Dinners/Edit/2
[Authorize]
public ActionResult Edit(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
return View(new DinnerFormViewModel(dinner));
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}
別の StackOverflow スレッドから考えられる解決策を読んだ後、「他の ModelState エラーをキャッチするため」というコメントの行が追加されました。
ASP.NET MVC Updatemodelは更新されていませんが、エラーはスローされていません
残念ながら、その解決策は役に立ちませんでした。
私のDinners/Edit.aspxビューの対応するマークアップは次のとおりです。
<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
<h2>Edit Dinner</h2>
<% Html.RenderPartial("DinnerForm"); %>
</asp:Content>
これは、DinnerForm.ascx 部分ビューの対応するマークアップです。この部分ビュー ファイルは、正常に動作している作成機能でも使用されます。
<%=Html.ValidationSummary("Please correct the errors and try again.") %>
<% using (Html.BeginForm()) { %>
<fieldset>
<p>
<label for="Title">Dinner Title:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Title)%>
<%=Html.ValidationMessage("Title", "*") %>
</p>
<p>
<label for="EventDate">EventDate:</label>
<%=Html.TextBoxFor(model => Model.Dinner.EventDate, new { value = String.Format("{0:g}", Model.Dinner.EventDate) })%>
<%=Html.ValidationMessage("EventDate", "*") %>
</p>
<p>
<label for="Description">Description:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Description)%>
<%=Html.ValidationMessage("Description", "*")%>
</p>
<p>
<label for="Address">Address:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Address)%>
<%=Html.ValidationMessage("Address", "*") %>
</p>
<p>
<label for="Country">Country:</label>
<%=Html.DropDownListFor(model => Model.Dinner.Country, Model.Countries)%>
<%=Html.ValidationMessage("Country", "*") %>
</p>
<p>
<label for="ContactPhone">ContactPhone #:</label>
<%=Html.TextBoxFor(model => Model.Dinner.ContactPhone)%>
<%=Html.ValidationMessage("ContactPhone", "*") %>
</p>
<p>
<label for="Latitude">Latitude:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Latitude)%>
<%=Html.ValidationMessage("Latitude", "*") %>
</p>
<p>
<label for="Longitude">Longitude:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Longitude)%>
<%=Html.ValidationMessage("Longitude", "*") %>
</p>
<p>
<input type="submit" value="Save"/>
</p>
</fieldset>
<% } %>
いずれにせよ、私は何時間もこれに取り組んできましたが、アイデアがありません。だから、私が間違っていることを理解するために、ここの誰かが私を正しい方向に向けるのを手伝ってくれることを願っています.