2

次のモデルを定義したASP.NETMVC3プロジェクトに取り組んでいます。

public class Model{
    [Key]
    int Id { get; set; }
    int MappedId { get; set; }
}

このモデルは、次のようにControllerからRazorビューに渡されます。

public class Controller:Controller{
    public ActionResult Edit(int id) {
        Model model = repository.Get(id);
        return View(model);
    }
}

モデルのプロパティがビューに表示されます。

@using(Html.BeginForm()) {
    @Html.HiddenFor(model => model.Id);
    @Html.HiddenFor(model => model.MappedId)
}

奇妙なことに、ビューに渡されたときにモデルプロパティの値が異なっていても、両方の非表示の入力が同じ値を取得します。たとえば、Model.Idの値が0で、Model.MappedChannelIdの値が7の場合、両方の非表示の入力が同じ値7に設定されます。

<input id="Id" class="valid" type="hidden" value="7" name="Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">
<input id="MappedId" class="valid" type="hidden" value="7" name="MappedId" data-val-required="The MappedId field is required." data-val-number="The field MappedId must be a number." data-val="true">

モデル.Idがビューに渡されたときに異なる値を持っている場合でも、Html.HiddenFor(model => model.Id)が値をmodel.MappedIdと同じ値に設定する理由について誰かが知っていますか?

4

1 に答える 1

2

私の推測では、アクションのidパラメーターからMappedId値を取得します。次に、Idプロパティを他の値で設定します。ただし、ビューでは、アクションパラメーターからのId値がまだあり、デフォルトのモデルバインダーはその値を使用してIdプロパティをバインドします。基本的に、モデルインスタンスからの値を無視します。

モデルのIdプロパティの名前を変更することで解決できます。それが望ましくない場合は、アクションパラメータの名前を変更する必要があります。ただし、クエリ文字列で値を渡したくない場合は、カスタムルートを作成する必要があります。

于 2012-12-09T16:16:16.463 に答える