2

私は 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>

<% } %>

いずれにせよ、私は何時間もこれに取り組んできましたが、アイデアがありません。だから、私が間違っていることを理解するために、ここの誰かが私を正しい方向に向けるのを手伝ってくれることを願っています.

4

3 に答える 3

2

dinnerRepository.Save()データベースを実際に更新するコードです。フォーム コレクションから値をUpdateModel(dinner)抽出し、それらをdinnerオブジェクトに配置します。

于 2010-05-29T23:36:04.740 に答える
1

あなたは何かが混じっています。DinnerFormViewModel を View に送信していますが、Dinner.Change を受信しようとしています。ポスト メソッドを次のように変更します。

[AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection formValues)
    {

        var dinner=new DinnerFormViewModel(dinnerRepository.GetDinner(id));

        try
        {
            UpdateModel(dinner);
            var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.Dinner.DinnerID });
        }
        catch
        {

            ModelState.AddRuleViolations(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner)); 
        }
    }

ここで見逃したものがあるかもしれません。今はDinnerFormViewModelを覚えていません。そちらをご確認ください

編集:実際、この投稿では問題が実際には解決されないことに気付きました。質問に投稿されたコードは私にとってはうまくいきます。問題がありますが、ここではありません。

于 2010-05-30T00:22:47.710 に答える
1

将来誰かに役立つ場合に備えて、私が疑ったように、ここでの問題は必ずしもDinnerFormViewModelの使用によるものではありませんでした。むしろ、Html.TextBoxFor などの厳密に型指定されたヘルパー メソッドの使用と、UpdateModel メソッドの呼び出し方法に問題がありました。

この問題とその解決策は、StackOverflow の別のスレッドで詳しく説明されています

于 2010-05-30T04:45:25.043 に答える