2013-10-17 71 views
3

我有我在我看來調用像這樣一個文本框:更新上Html.TextBoxFor()onchange事件模型值沒有提交

@Html.TextBoxFor(Function(m) m.ActivityIDReturn) 

我想什麼,能夠做的就是當一個值插入此文本框我希望它更新模型,而不必擊中任何類型的提交按鈕。通過此文本框的值在視圖中填充了幾個元素。

所以理想的文本框會看起來是這樣的:

@Html.TextBoxFor(Function(m) m.ActivityIDReturn, new with {Key .onchange=UpdateModel()}) 

@Html.TextBoxFor(Function(m) m.ActivityIDReturn, new with {Key .onchange= RETLog(ActivityIDReturn:=ActivityIDReturn)}) 

RETLog()是創建在firstplace視圖功能。

到目前爲止,我已經能夠做到這一點的唯一方法是:

@Html.TextBoxFor(Function(m) m.ActivityIDReturn, New With {Key .onchange = "javascript:submit()"}) 

但我只能想象什麼可怕的副作用可能來自這種事情。

編輯:究竟是什麼,我想在這裏完成

在我的模型我有這樣的:

Public Property PS As RecordsTaskView 
      Get 
       Return GlobalVar.db.PS.RecordsTaskViews.Find(ActivityIDReturn) 
      End Get 
      Set(ByVal value As RecordsTaskView) 
       value = GlobalVar.db.PS.RecordsTaskViews.Find(ActivityIDReturn) 
      End Set 
End Property 

在我看來,我有這樣的:

@Html.LabelFor(Function(m) m.ActivityIDReturn) 
@Html.TextBoxFor(Function(m) m.ActivityIDReturn, New With {Key .onchange="javascript:submit()"}) 
@Html.DisplayFor(Function(m) m.PS.RefActionID) 
@Html.DisplayFor(Function(m) m.PS.QutDesc) 
@Html.DisplayFor(Function(m) m.PS.TaskDesc) 
@Html.DisplayFor(Function(m) m.PS.CltCode) 
@Html.DisplayFor(Function(m) m.PS.CltDesc) 
@Html.DisplayFor(Function(m) m.PS.BenIDin) 

基本上所有這些DisplayFor的值由這個文本框的值填充。我希望當用戶在文本框中輸入一個值時,用戶不必刷新頁面,或者點擊回車或點擊任何按鈕,就可以填充這些DisplayFor值。

這是我在它的全部代碼視圖:https://gist.github.com/aaronmallen/7042328

+1

我想你可能對MVC的工作原理以及客戶端和服務器之間的分離有一個根本性的誤解。一旦視圖被呈現併發送到客戶端,它基本上是用服務器端模型完成的。 – jmoerdyk

+0

@jmoerdyk我明白MVC是如何工作的。基本上我試圖從視圖中獲取表單以回發到控制器,而不實際將所有內容提交給模型。 – aaronmallen

+1

這樣做使用'Ajax.BeginForm()'.... – Olrac

回答

7

你需要使用jQuery的AJAX調用。

$('#ActivityIDReturn').change(function(){ 
    $.ajax({ 
     url: '@Url.Action("Action", "Controller")', 
     type: 'post', 
     data: { 
      Text: $('#TextField').val() 
     }, 
     success: function (_result) { 
      $('#TaskDesc').val(_result.foo); 
     } 
    }); 
}); 

我還沒有做你喜歡你在你的提琴手。我一直用lamda的東西來做,就像

@Html.DisplayFor(Function(m) m.TaskDesc) 

它會自動生成一個TaskDesc的id。您需要查看您生成的Html,以確保您在jquery匹配中調用的id。

和控制方法

<HttpPost()> _ 
Public Function UpdateFields(Text As String) As ActionResult 
    Dim model as MODELNAME = //query the database 
    Return Json(New With { .foo = model.bar, .baz = model.baz }); 
End Function 

這將激發每次領域的變化,所以如果他們輸入與10個字母的單詞,將火10倍。希望這可以幫助

+0

那麼我在//更新字段區域放什麼? @ Model.ActivityIDReturn = TextBoxFor(Function(m)m.ActivityIDReturn)? – aaronmallen

+0

我不知道你想做什麼,使用這段代碼,你的文本框的值將被傳回到控制器,你可以做一些事情並將值傳遞迴視圖(_result in the碼)。所以你可以做一些像$('#text1')。val(_result.text1);使用來自控制器的值更新文本字段 –

+0

基本上這個文本框在給定值時填充了一大堆HTML.DisplayFor(Function(m)m.RandomElementToDisplay)我試圖完成的是這些DisplayFor元素會自動填充,而沒有用戶在向此文本框輸入值時必須提交或刷新。 – aaronmallen