0

私は MVC 3 を使用しています。DB 内の要素を削除するビューがあります。サービス層は、操作を承認する前に、すべてのロジックが整っていることを確認します。役割違反の場合、メッセージが Html.Summary に表示されるため、削除操作は中止されます。

私の問題は、サービス層からの Html.Summary のメッセージがビューに到着すると、さまざまなフィールドのデータが失われるため、アイテムの ID、名前、および説明が表示されないことです。

正しい方向に私を指摘できますか?私が間違っていることは何ですか?ありがとう

public ActionResult Delete(int id)
    {
        Typology typology = _typologytService.FindById(id);
        TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology);
        return View(deleteViewModel);
    }

    //
    // POST: /ManageTypologies/Delete/5

    [HttpPost]
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel)
    {
        if (ModelState.IsValid)
        {
            Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel);
            _typologytService.Delete(typology.TypologyId);
            if (ModelState.IsValid)
                return RedirectToAction("Index");
        }
        return View();         
    }

@model xxx.ViewModels.TypologyDeleteViewModel
@{
    ViewBag.Title = "Delete";
}
<h2>
    Delete</h2>
<h3>
    Are you sure you want to delete this?</h3>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.TypologyId)
    <fieldset>
        <legend>TypologyDeleteViewModel</legend>
        <div class="display-label">
            TypologyId</div>
        <div class="display-field">
            @Html.DisplayFor(model => model.TypologyId)
        </div>
        <div class="display-label">
            Name</div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Name)
        </div>
        <div class="display-label">
            Description</div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Description)
        </div>
        <p>
            <input type="submit" value="Delete" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
4

1 に答える 1

1

投稿方法を次のように変更します。

[HttpPost]
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel)
    {
        if (ModelState.IsValid)
        {
            Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel);
            _typologytService.Delete(typology.TypologyId);
            if (ModelState.IsValid)
                return RedirectToAction("Index");
        }
        return View(deleteViewModel);         
    }

無効なモデル状態を返す場合、モデルをビューに戻していません。また、上記のコードで ModelState.IsValid プロパティを 2 回チェックする理由はありますか? ModelStateError を追加している可能性がある場所がわかりません。2 番目の if ステートメントからのパスがありません。

最後に、deleteViewModel にドロップダウン リストなどが含まれている場合 (この場合は表示されません)、ビューを返す前にそれらを再設定する必要があります。

編集

あなたの場合、他のプロパティに EditorFor HTML ヘルパーを使用していないため、上記は機能しません。<span>あなたのビューは、サーバーにポストバックされない説明などのタグに相当するものを吐き出しています。<input type="hidden"フィールド にあるため、返されるのは Id プロパティだけです。

したがって、あなたの場合、アクションメソッドを次のように更新する必要があります。

   [HttpPost]
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel)
    {
        if (ModelState.IsValid)
        {
            Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel);
            _typologytService.Delete(typology.TypologyId);
            if (ModelState.IsValid)
                return RedirectToAction("Index");
        }
        Typology typology = _typologytService.FindById(typology.TypologyId);
        TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology);
        return View(deleteViewModel);         
    }

または、ID で行っているように非表示の入力フィールドに値を保存して、すべての値がサーバーに戻され、データベース呼び出しを再度行う必要がないようにします。

于 2012-07-11T20:09:49.917 に答える