2015-04-06 29 views
1

我有以下編輯模板:

DropDownListEditorTemplate

@model DropDownListViewModel 

<script type="text/javascript"> 
    $(function() { 
     $("select").on("change", function() { 
      $.ajax({ 
       type: "POST", 
       url: '@Url.Action("ListItemChanged", "Controller")', 
       data: { "Value": "@Model.Items.FirstOrDefault(x => x.Selected).Value" } 
      }); 
     }); 
    }) 
</script> 

@Html.DropDownListFor(m => m.Value, Model.Items, "(Select)") 

控制器

public ActionResult ListItemChanged(string selectedItem) 
{ 
    // Stuff. 
} 

的問題是當編輯器模板加載時,我得到一個錯誤,說@ Model.Items爲null(「Object reference n ot設置爲一個對象的實例「)。這是有道理的,除了爲什麼該行將在沒有任何選擇項改變的情況下進行評估?即使當我將$ .ajax調用更改爲僅在1 == 2時執行時,它仍會給我那個錯誤。很明顯,即使jQuery函數沒有執行,該行也正在被評估。

鑑於此,我如何防止發生錯誤? @ Model.Items.First(x => x.Selected).Value只有在下拉列表項被選中後纔會有值。

+0

它將在viewv渲染執行,因爲它的服務器端代碼 –

+0

所以我如何才能選擇下拉列表項的值一旦它被選中? – jrsowles

+1

需要該元素的ID並在'$ .ajax'調用中將其引用爲'$('#elementId')。val()'而不是'@ Model.Items。(...)'。鑑於你已經綁定,你可以引用'$(this).val()'。 –

回答

3

試試這個:

@model DropDownListViewModel 

<script type="text/javascript"> 
    $(function() { 
     $("select").on("change", function() { 
      $.ajax({ 
       type: "POST", 
       url: '@Url.Action("ListItemChanged", "Controller")', 
       data: { "Value": $(this).val() } 
      }); 
     }); 
    }) 
</script> 

@Html.DropDownListFor(m => m.Value, Model.Items, "(Select)") 
+0

完美,這正是我所需要的。謝謝! – jrsowles

0

你要明白什麼是,該@expressions在服務器內解析。您還必須瞭解,MVC模型綁定器根據其名稱區分字段。在jquery ajax函數的數據對象中,在傳遞對象文本的地方,您必須指定變量的名稱,因爲您的操作方法期望它爲(,您的案例爲selectedItem)。所以,正確的做法應該是:

$("select").on('change', function() { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("ListItemChanged", "Controller")', 
      data: { "selectedItem": $(this).val() } 
     }); 
}); 

//Server 
[HttpPost] 
public ActionResult ListItemChanged(string selectedItem) 
{ 
    // Stuff. 
}