0

ViewModels を使用して、ビューからコントローラーに、またはその逆に情報を渡すことについて学んでいます。作成アクション、ビュー、およびビューモデルは完全に機能していますが、編集アクションに問題があります。エラーが発生します:

ディクショナリに渡されたモデル アイテムのタイプは「CatVM.Models.Cat」ですが、このディクショナリにはタイプ「CatVM.Models.EditCatViewModel」のモデル アイテムが必要です。

これが私のコードです:

コントローラーの方法

    // GET: /Cats/Edit/5
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Cat cat = unitOfWork.CatRepository.GetByID(id);
        if (cat == null)
        {
            return HttpNotFound();
        }
        return View(cat);
    }

意見

@model CatVM.Models.EditCatViewModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>


@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Cat</h4>
    <hr />
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.ID)

    <div class="form-group">
        @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Color, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Color)
            @Html.ValidationMessageFor(model => model.Color)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.FurLength, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.FurLength)
            @Html.ValidationMessageFor(model => model.FurLength)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Size, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Size)
            @Html.ValidationMessageFor(model => model.Size)
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

EditCatViewModel

public class EditCatViewModel
{
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Required]
    [StringLength(50)]
    public string Color { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Fur Type")]
    public string FurLength { get; set; }

    [StringLength(50)]
    public string Size { get; set; }
}
}
4

2 に答える 2

3

これは、受け取るアイテムCatRepository.GetByID(id);のタイプCatが ではなく であるためEditCatViewModelです。

このオブジェクトから新しいビューモデルを作成することで、これを回避できます。

Cat cat = unitOfWork.CatRepository.GetByID(id);
var viewModel = new EditCatViewModel {
 Name = cat.Name,
 Color = cat.Color,
 FurLength = cat.FurLength,
 Size = cat.Size
};

return View(viewModel);

あるいは、暗黙的または明示的なキャスト メソッドを構築するか、 AutoMapperなどのマッピング ツールを使用することもできます。

于 2013-11-03T15:14:11.863 に答える
1

返されるビューのタイプは CatVM.Models.EditCatViewModel である必要があり、Cat を返すようになりました

ビュー(猫)を返します。

モデルをビューモデルに変換し、このオブジェクトをビューに戻します

于 2013-11-03T15:13:40.380 に答える