2013-03-10 35 views
1

我正在使用免費的Kendo web控件。我之前在幾個地方使用了網格視圖,並決定使用彈出式樣式編輯來處理當前項目。Kendo.Web Grid Popup使用組合框創建

我大部分工作。我有三個組合框用於分類,銀行賬戶和收款人,當我編輯現有項目時,傳回我的MVC操作的模型對象具有正確的值。但是,當我單擊創建按鈕時,三個組合框值將作爲null返回給控制器。

下面是對這一觀點的CSHTML代碼:

@using System 
@using System.Linq 

@{ 
    ViewBag.Title = "Transactions"; 
} 

@section Head 
{ 
    <link href="~/Content/kendo/kendo.common.min.css" rel="stylesheet" /> 
    <link href="~/Content/kendo/kendo.default.min.css" rel="stylesheet" /> 
    <script src="~/Scripts/kendo/kendo.web.min.js"> </script> 
} 

@section featured 
{ 
    <section class="featured"> 
     <div class="content-wrapper"> 
      <hgroup class="title"> 
       <h1>@ViewBag.Title</h1> 
      </hgroup> 
     </div> 
    </section> 
} 

<div id="grid"></div> 

<script> 
    $(function() { 
     $("#grid").kendoGrid({ 
      height: 350, 
      toolbar: [{ name: "create", text: "Create New Transaction" }], 
      columns: 
      [ 
       { field: "Date", width: "100px", template: '#= kendo.toString(Date,"MM/dd/yyyy") #' }, 
       { field: "Amount", format: "{0:c}", width: "100px" }, 
       { field: "Category", width: "80px", editor: categoryDropDownEditor, template: "#=Category.Name#" }, 
       { field: "BankAccount", title: "Account", width: "80px", editor: bankAccountDropDownEditor, template: "#=BankAccount.Name#" }, 
       { field: "Payee", width: "80px", editor: payeeDropDownEditor, template: "#=Payee.Name#" }, 
       { command: ["edit", "destroy"], title: "&nbsp;", width: "160px" } 
      ], 
      editable: { mode: "popup", confirmation: "Are you sure you want to delete this transaction?" }, 
      pageable: 
      { 
       refresh: true, 
       pageSizes: true 
      }, 
      sortable: true, 
      filterable: false, 
      dataSource: 
      { 
       serverPaging: true, 
       serverFiltering: true, 
       serverSorting: true, 
       pageSize: 7, 
       schema: 
       { 
        data: "Data", 
        total: "Total", 
        model: 
        { 
         id: "Id", 
         fields: 
         { 
          Id: { editable: false, nullable: true }, 
          Date: { type: "Date" }, 
          Amount: { type: "number", validation: { required: true, min: 0 } }, 
          Category: { validation: { required: true } }, 
          BankAccount: { validation: { required: true } }, 
          Payee: { validation: { required: true } }, 
          Note: { validation: { required: false } } 
         } 
        } 
       }, 
       batch: false, 
       transport: 
       { 
        create: 
        { 
         url: "@Url.Action("Create", "Transaction")", 
         contentType: "application/json", 
         type: "POST" 
        }, 
        read: 
        { 
         url: "@Url.Action("Read", "Transaction")", 
         contentType: "application/json", 
         type: "POST" 
        }, 
        update: 
        { 
         url: "@Url.Action("Update", "Transaction")", 
         contentType: "application/json", 
         type: "POST" 
        }, 
        destroy: 
        { 
         url: "@Url.Action("Delete", "Transaction")", 
         contentType: "application/json", 
         type: "POST" 
        }, 
        parameterMap: function(data) 
        { 
         return JSON.stringify(data); 
        } 
       } 
      } 
     }); 

     function categoryDropDownEditor(container, options) 
     { 
      $('<input required data-text-field="Name" data-value-field="Id" data-bind="value:' + options.field + '"/>') 
       .appendTo(container) 
       .kendoDropDownList(
        { 
         autoBind: true, 
         dataValueFileld: "Id", 
         dataTextField: "Name", 
         dataSource: 
         { 
          type: "json", 
          transport: { read: "@Url.Action("GetCategories", "Transaction")" } 
         } 
        }); 
     } 

     function bankAccountDropDownEditor(container, options) 
     { 
      $('<input required data-text-field="Name" data-value-field="Id" data-bind="value:' + options.field + '"/>') 
       .appendTo(container) 
       .kendoDropDownList(
        { 
         autoBind: true, 
         dataValueFileld: "Id", 
         dataTextField: "Name", 
         dataSource: 
         { 
          type: "json", 
          transport: { read: "@Url.Action("GetBankAccounts", "Transaction")" } 
         } 
        }); 
     } 

     function payeeDropDownEditor(container, options) 
     { 
      $('<input required data-text-field="Name" data-value-field="Id" data-bind="value:' + options.field + '"/>') 
       .appendTo(container) 
       .kendoDropDownList(
        { 
         autoBind: true, 
         dataValueFileld: "Id", 
         dataTextField: "Name", 
         dataSource: 
         { 
          type: "json", 
          transport: { read: "@Url.Action("GetPayees", "Transaction")" } 
         } 
        }); 
     } 
    }); 
</script> 

結合到劍道組合框必須正常工作,否則編輯也會失敗。我能想到的是該對象沒有正確創建。此外,它默認選擇組合框中的第一項,但即便如此,也不會綁定該值。

以下是我的創造和更新操作的代碼:

[HttpPost] 
    public ActionResult Create(TransactionModel transactionModel) 
    { 
     var transaction = _moneyBO.CreateTransaction(); 

     Mapper.Map(transactionModel, transaction); 

     _moneyBO.UpdateTransaction(transaction); 

     return Json(Mapper.Map<TransactionModel>(transaction)); 
    } 

    public ActionResult Update(TransactionModel transactionModel) 
    { 
     var transaction = _moneyBO.Transactions.SingleOrDefault(x => x.Id == transactionModel.Id); 

     if (transaction == null) 
      return View("NotFound"); 

     Mapper.Map(transactionModel, transaction); 

     _moneyBO.UpdateTransaction(transaction); 

     return Json(Mapper.Map<TransactionModel>(transaction)); 
    } 

我還沒有發現使用彈出自定義編輯一個很好的例子。 Kendo網站上的示例以內聯方式工作,但如果將示例更改爲彈出式窗口,則不起作用。

回答

0

不確定這是否是唯一的問題,但在您的代碼示例中,它看起來像您的下拉菜單的初始化不完全正確。你已經寫dataValueFileld這應該是dataValueField

kendoDropDownList({ 
    autoBind: true, 
    dataValueFileld: "Id",   <-- Incorrect spelling 
    dataTextField: "Name", 
    dataSource: 
    { 
     type: "json", 
     transport: { read: "@Url.Action("GetPayees", "Transaction")" } 
    } 
}); 
+0

我沒有注意到。謝謝,我今晚會嘗試一下,看看有沒有什麼不同。我的猜測可能不是,因爲編輯工作在相同的連接,但誰知道。 – 2013-03-13 18:27:16

+0

上週我一直忙於其他項目。希望在這個週末看看這個。 – 2013-03-23 02:00:43

1

我有同樣的問題。寫,如果你解決它,請 我發現,Kendo認爲「null」(默認爲int?)是ObservableObject(當ComboBox初始化時),這就是爲什麼它不能被解析爲「number」。如果你編輯項目(不創建),價值id不是「null」和模型bindind工作很好