ユーザーがグリッドに入力した情報は、実際にはモデルに渡されないようで (私の理論)、null
コントローラーに値が返されます。私はさまざまな小さな修正を試み、かなり長い間見回してきましたが、ここで問題を確認した経験はありません. 誰でもここで助けを提供できますか?
意見:
@model Johnson.Billing.Models.TaxService
@using(Html.BeginForm("Save", "TaxService"))
{
<div>
@(Html.Kendo().Grid(Model.Locations)
.Name("Locations")
.Columns(columns =>
{
columns.Command(command => { command.Destroy(); }).Width(80);
columns.Bound(o => o.State).Title("State").EditorTemplateName("TaxService");
columns.Bound(o => o.LocationNum).Title("Loc #");
columns.Bound(o => o.BasePremium).Title("Base Prem:").Format("{0:c}");
columns.Bound(o => o.CargoPremium).Title("Cargo Prem:").Format("{0:c}");
columns.Bound(o => o.InlandMarinePremium).Title("Inland Marine Prem:").Format("{0:c}");
columns.Bound(o => o.LiabilityPremium).Title("Liability Prem:").Format("{0:c}");
columns.Bound(o => o.LimitOfLiability).Title("Limit of Liability:").Format("{0:c}");
columns.Bound(o => o.PropertyContentPremium).Title("Property Content Prem:").Format("{0:c}");
})
.ToolBar(toolbar => toolbar.Create().Text("Add a State Tax Calculation"))
.Editable(editable => editable.Mode(GridEditMode.InCell))
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
.Model(model => model.Id(o => o.LocationNum))
//.Create(update => update.Action("Location_Create", "TaxService"))
))
</div>
<input type="submit" value="Test Taxes" />
}
(最近追加した create 関数が動かなかったので、とりあえずコメントアウトしました)
モデル:
public class TaxService
{
public string DepartmentType { get; set; }
public DateTime? TransactionDate { get; set; }
public string TransactionType { get; set; }
public DateTime? OriginalTransactionDate { get; set; }
public int PolicyFee { get; set; }
public int CompanyFee { get; set; }
public int CompanyID { get; set; }
public string IncludesWind { get; set; }
public string CancellationType { get; set; }
public DateTime? EffectiveDate { get; set; }
public DateTime? TransactionEffectiveDate { get; set; }
public List<Location> Locations { get; set; }
}
public class Location
{
public int LocationNum { get; set; }
public string State { get; set; }
public int BasePremium { get; set; }
public int CargoPremium { get; set; }
public int InlandMarinePremium { get; set; }
public int LiabilityPremium { get; set; }
public int LimitOfLiability { get; set; }
public int PropertyContentPremium { get; set; }
}
}
コントローラ:
public class TaxServiceController : Controller
{
public ActionResult Index()
{
return View(new TaxService
{
Locations = new List<Location>{
new Location()
}
});
}
//[HttpPost]
//public ActionResult Location_Create(Location loc)
//{
//var x = new Location();
//if (loc != null && ModelState.IsValid)
//{
//x.State = loc.State;
//x.LocationNum = loc.LocationNum;
//x.PropertyContentPremium = loc.PropertyContentPremium;
//x.LimitOfLiability = loc.LimitOfLiability;
//x.LiabilityPremium = loc.LiabilityPremium;
//x.InlandMarinePremium = loc.InlandMarinePremium;
//x.CargoPremium = loc.CargoPremium;
//x.BasePremium = loc.BasePremium;
//};
//return (null);
//}
[HttpPost]
public ActionResult Save(TaxService tax)
{
using (var svc = new StateTaxService.StateTaxServiceClient())
{
var locations = new List<StateTaxService.TaxLocationsRequest>();
foreach (var location in tax.Locations)
{
locations.Add(new StateTaxService.TaxLocationsRequest
{
コントローラーの Location_Create も同じですが、うまくいかなかったのでコメントアウトしました。
locations
「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーで、問題領域である foreach ステートメントの直後にコントローラーを停止しました。変動税では、Locations
リストも null であるため、そのリストには実際には値がないと思います。
編集/解決策:
ClientTemplate
ビューの最後に配置されたこの関数とともに、すべての列の後にフォーマットを追加することで、最終的に修正しました。
<script>
function index(dataItem) {
var data = $("#Locations").data("kendoGrid").dataSource.data();
return data.indexOf(dataItem);
}
</script>