2012-10-25 18 views
0

我有一個應用程序,可以在tabcontrol中同時打開許多視圖。使用knockout和ajax應用程序在動作之間共享視圖

我在所有的意見中使用淘汰賽。

我有一個像下面兩個動作:

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> 

在我看來,我有兩個觀察到的ViewModels,一個爲'添加'模式和另一個'編輯'模式。我不能對這兩種模式使用相同的視圖模型,因爲當兩個操作都打開時,會在客戶端導致兩個具有相同名稱的對象。我以這種方式做錯了嗎?

我想知道如果這是一個更好的方法來實現。任何機構能否提出另一種更好的方法來做我想做的事?

tks。

回答

0

我不確定我完全理解問題,但從我收集的內容來看,相同的局部視圖可能會在選項卡控件的同一頁面上存在兩次:一個用於添加,一個用於編輯。你只希望他們能夠輸入Codigo值,但是,在添加上。編輯是否應該使用現有的ParametroModel?首先,我建議你讓你的表單ID唯一(也許通過簡單地追加一個隨機後綴)。通過這種方式,當您將綁定應用到表單時,您始終可以確定您正在向正確的方向執行此操作。其次,看起來你的JavaScript在添加和編輯之外沒有變量名稱的區別。你也可以將它凝聚成一個。我注意到的最後一件事是,表單元素上沒有knockout數據綁定屬性。你有沒有得到這個工作呢?除此之外,只要在你的視圖中沒有其他地方你可以正常工作,你可以在腳本執行後執行一個覆蓋ko.applyBindings(someViewModel)

相關問題