2012-10-12 52 views
0

我有一個「問題」對象的控制器;如果這些問題的類型爲「MultipleChoice」,那麼我希望能夠將「MultipleChoiceOption」對象的集合添加到問題中......迄今爲止,這很好。我可以使用Javascript在我的MVC控制器中觸發一個方法嗎?

我遇到的問題是,當我編輯問題時,將其類型更改爲MultipleChoice,然後添加選項,需要返回編輯問題視圖並提交編輯後的問題,否則Question.Type中的更改爲丟失。顯然這有點煩人,所以我想要做的就是掛鉤一個方法,只要下拉列表值發生變化,就會觸發QuestionController中的相關方法。

我在我的編輯問查看以下內容:

@Html.DropDownListFor(model => model.Type, Helper.GetSelectList(), new { id = "QuestionTypeDropDown", onchange = "OnChange();" }) 

<script type="text/javascript"> 


function OnChange(text) { 
    ...do something here 

     } 

    } 
</script> 

而且這種方法在我的問題控制器:

[HttpPost] 
    public ActionResult QuestionTypeEdited(Question question) 
    { 
     if (ModelState.IsValid) 
     { 
      SaveQuestion(question, false); 
      return RedirectToAction("Edit", "Question", new { id = question.OwningPulseId }); 
     } 
     return View(question); 
    } 

但我不知道如何連接起來。我嘗試了一種使用我在網上找到的Ajax的方法,但是這只是阻止了js開火(也許我沒有Ajax?對不起,我對Ajax一無所知,因此可能是一個愚蠢的聲明!)。是否有可能使用「簡單」Javascript?

如果我需要明確指定控制器,請務必註明瞭如果你:-)知道

乾杯

+0

它不會超級簡單,但可以使用javascript和AJAX。如果你有JavaScript,你可以使用異步JavaScript和XML。 – jrummell

回答

1

這是你可以做一個非常簡單的例子。 (沒有經過測試)

的JavaScript:

// wire up your change event unobtrusively with jQuery 
$("#Type").change(function() { 
    // find the form that the select belongs to and serialize it 
    var question = $(this).closest("form").serialize(); 
    // POST the form data to your controller 
    $.post("Question/QuestionTypeEdited", question, function(data) { 
     // this function executes when the POST completes 
     // if data has a RedirectUrl, redirect 
     if (data.RedirectUrl) 
     { 
     window.location = data.RedirectUrl; 
     } 
     else 
     { 
     // display any errors - I'm using alert because its very simple, you'll probably want to use a div 
     alert(data.Errors); 
     } 
    }); 
}); 

這裏的行動:

[HttpPost] 
public ActionResult QuestionTypeEdited(Question question) 
{ 
    if (ModelState.IsValid) 
    { 
     SaveQuestion(question, false); 

     // return a JSON result with a redirect url 
     return Json(new {RedirectUrl = "Edit/Question/"+question.OwningPulseId}); 
    } 

    // return a JSON result with the errors 
    return Json(new {Errors = ModelState.Errors}); 
} 

參考文獻:

+0

我似乎沒有出現在Intellisense中的.serialize選項;當我嘗試這種方法時,什麼都沒有發生,所以我認爲它在Javascript中導致錯誤。 – user1711233

+0

您是否在Javascript控制檯中看到錯誤? – jrummell

0

如果你想要得到的只是回發到你的控制器時,DDL改變,你可以這樣做:

<script type="text/javascript"> 

function OnChange() { 
    document.forms[0].submit(); 

    } 
</script> 

假設你是內一個表格:

@using (Html.BeginForm()) 

您將從DropDownListFor中獲得值到[HttpPost]控制器

相關問題