2016-04-22 13 views
1

私はMVCのコントローラに必要なすべてのデータを渡すのに苦労しています。コードは以下の通りである:コントローラに値を渡す

<td><a [email protected]("AddCourseToStudentPlan", "Users", new { 
courseID = c.CourseId, userID = user.UserId, semNum = num}) title="Add Course 
to Semester" >"Here"</a></td> 

(現在numをもちろん動作しませんvar num = 1;、と定義される。)

もちろんIDとユーザIDの罰金を渡しています。これらの値は基本的にViewBagから来ています。

しかし、semNumは全く違うものに依存しています。

<ul class="nav nav-tabs" id="Semtabs"> 
        @{ var year = plan.CatalogYear; } 
        <li class="active"><a href="#SEM1" onclick="StoreNum(1)" data-toggle="tab" aria-expanded="true">Fall @year</a></li> 
        @{ year += 1; } 
        <li class=""><a href="#SEM2" data-toggle="tab" aria-expanded="true">Spring @year</a></li> 
        <li class=""><a href="#SEM3" data-toggle="tab" aria-expanded="true">Fall 2014</a></li> 
        <li class=""><a href="#SEM4" data-toggle="tab" aria-expanded="true">Spring 2015</a></li> 
        <li class=""><a href="#SEM5" data-toggle="tab" aria-expanded="true">Fall 2015</a></li> 
        <li class=""><a href="#SEM6" data-toggle="tab" aria-expanded="true">Spring 2016</a></li> 
        <li class=""><a href="#SEM7" data-toggle="tab" aria-expanded="true">Fall 2016</a></li> 
        ... 

意図した出力は、タブのいずれかをユーザーがクリックすると、彼らは追加したコースのリストを参照し、できているときということですコードの前のコードブロックのリンクをクリックして、このタブにコースを追加します。したがって、タブをクリックすると@Url.Action()メソッドのnumの値を変更する必要があります。しかし、もちろんC#はサーバー側であるため、これを行うことはできません。

問題は、ページが読み込まれた後、どのように変数semNum(クライアント側で決定される)を@Url.Action()メソッドに渡すことができるかです。

+0

あなたは、ユーザーがリンクをクリックしたときにサーバーに最終 'num'値を掲示し、あなたの質問は私に本当に明確ではない – silkfire

+0

、あなたのコントローラに応じてそのアクションにリダイレクトすることができます。しかし、問題がUrl.Actionにある場合は、それを使用してスキップすることができます。関数内でJavaスクリプト関数を使用するだけで、番号を見つけてリダイレクトを行う必要があります。 –

答えて

0

複数の方法があります。これはかなり直感的で、Visual Studioでは構文エラーが発生しません。

  1. 知っている情報でURLテンプレートを作成します。
  2. リンクをクリックすると、タブの現在の状態を確認します。
  3. この情報を使用してURLを完成させます。
  4. 必要に応じてナビゲートします。
<!-- define a link/button, but don't set the URL --> 
<a id="add-url-button">Add Course to Semester</a> 

<!-- your existing tabs --> 
<ul class="nav nav-tabs" id="Semtabs"> 
    <li><a href="#SEM2" data-semester-number="2">Tab 1</a></li> 
    <li class="active"><a href="#SEM3" data-semester-number="3">Tab 2</a></li> 

    <!-- etc. --> 
</ul> 
<script> 

// Create a URL template  

// It sounds like semNum is the only value that needs to vary, 
// but you can create a template with multiple placeholders. 

// We pass zero for semNum so that routes will still match without 
// conflicting with a real semester number. 
var addUrlTemplate = '@Url.Action("AddCourseToStudentPlan", "Users", new { courseID = c.CourseId, userID = user.UserId, semNum = 0 }'; 

// jQuery here for brevity (will work fine with vanilla JS) 

var addButton = $("#add-url-button"), 
    tabs = $("#Semtabs"); 

addButton.click(function(){ 

    // determine the selected tab by interrogating the list of tabs 
    var activeTab = tabs.find("li.active"), 
     semesterNumber = activeTab.attr("semester-numer"); 

    // Construct the complete URL. Depending on the URL, you may need 
    // a smarter regex. Be sure that there is no chance of accidentally 
    // replacing the wrong value. 
    var addUrl = addUrlTemplate.replace(/0$/, semesterNumber); 

    // navigate as desired 
    window.location.href = addUrl; 
)); 

</script> 
+0

もっと明確にすべきですが、これを非常に速く書いています。謝罪します。 courseIDも変数です。ユーザーも同様に選択できるようにしたいと思います。このようにしてpremade URLを設定することはできません。しかし、私は、javascript関数が正しいURLを構築するようにこの解決策を変更できるかもしれないと思う。本当にありがとう! –

関連する問題