0

タブコントロールで多くのビューを同時に開くことができるアプリケーションがあります。

私はすべてのビューでノックアウトを使用しています。

以下のような2つのアクションがあります。

    public ActionResult Edit()
    {
        ViewData["Mode"] = "Edit";
        return PartialView("AddOrEdit", new ParametroModel() { Codigo = "banco", Descricao = "String de conexao do banco de dados" });
    }

    public ActionResult Add()
    {
        ViewData["Mode"] = "Add";
        return PartialView("AddOrEdit", new ParametroModel() { Codigo = "banco", Descricao = "String de conexao do banco de dados" });
    }

どちらも同じ部分ビュー「AddOrEdit」を共有しています。私のビューに従ってください:

@model CCL.Apoio.Web.Models.ParametroModel
@{
    var isEdit = ViewData["Mode"] == "Edit";
    var isAdd = ViewData["Mode"] == "Add";
}

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "formParametro" }))
{
    @Html.Partial("_FormValidation")
    <fieldset>
        <legend>Dados do parâmetro</legend>
        <dl>
            <dt>
                <label>Código</label></dt>
            @if (isAdd)
            {
                <dd>@Html.TextBoxFor(m => m.Codigo)</dd>
            }
            else
            {
                <dd>@Html.DisplayFor(m => m.Codigo)</dd>
            }
        </dl>
        <dl>
            <dt>
                <label>Descrição</label></dt>
            <dd>
                @Html.TextAreaFor(m => m.Descricao)</dd>
        </dl>
        <dl>
            <dt>
                <label>Valor</label></dt>
            <dd>
                @Html.TextAreaFor(m => m.Valor)
            </dd>
        </dl>

        <dl>
            <dt>&nbsp;</dt>
            <dd>
                <input type="submit" value="Cadastrar" onclick="" /></dd>
        </dl>
    </fieldset>
}

<script type="text/javascript">
    @if (isEdit)
    {
        <text>
        var parametroEditModel = ko.mapping.fromJSON('@Html.Raw(Json.Encode(Model))');
        parametroEditModel.Save = function () {
            ModuloHelper.ajaxPut('/Api/Parametros', parametroEditModel); //Post data
        };
        ko.applyBindings(parametroEditModel, document.getElementById("formParametro"));
        </text>
    }
    else if (isAdd)
    {
        <text>
        var parametroAddModel = ko.mapping.fromJSON('@Html.Raw(Json.Encode(Model))');
        parametroAddModel.Save = function () {
            ModuloHelper.ajaxPost('/Api/Parametros', parametroAddModel);
        };
        ko.applyBindings(parametroAddModel, document.getElementById("formParametro"));
        </text>

    }
</script>

私の見解では、監視可能なビューモデルが 2 つあります。1 つは「追加」モード用で、もう 1 つは「編集」モード用です。両方のモードで同じビューモデルを使用することはできません。両方のアクションが開かれているときに、クライアント側で同じ名前のオブジェクトが 2 つあるためです。私はこのように間違っていますか?

それを達成するためのより良いアプローチであるかどうかを知りたいです。私が望むことを行うための別のより良い方法を提案できる体はありますか?

わかりました。

4

1 に答える 1

0

問題を正確に理解しているかどうかはわかりませんが、収集したものから、同じ部分ビューがタブ コントロールの同じページに 2 回存在する可能性があります。1 つは追加用、もう 1 つは編集用です。ただし、追加時に Codigo 値を入力できるようにするだけです。編集は既存の ParametroModel を使用する必要がありますか?

まず、フォーム ID を一意にすることをお勧めします (おそらく、ランダムな後置を追加するだけです)。そうすれば、バインディングをフォームに適用するときに、正しいバインディングを適用していることを常に確認できます。第二に、変数名以外の追加と編集の間に JavaScript に違いはないようです。それを一つに凝縮することもできます。最後に気付いたのは、フォーム要素にノックアウト データ バインド属性がないことです。これはまだ機能していますか?ko.applyBindings(someViewModel)それ以外は、このスクリプトが実行された後、ビューのどこにもブランケットを実行しない限り、正常に動作するはずです。

于 2012-12-19T20:06:04.033 に答える