2013-01-09 54 views
5

Tôi muốn chuyển biến javascript trong một phương thức @ Url.Action làm thông số tuyến đường.Chuyển biến Javascript để định tuyến giá trị trong MVC3

Tôi muốn chuyển biến javascript của màn hình dưới dạng thông số tuyến đường sang phương thức hành động của tôi.

Tôi có kiểu xem với thuộc tính enum ScreenMode và dựa trên nó i nên gọi một hành động trong Ajax. Tôi cũng cần chuyển một biến số javascript làm thông số cho tuyến đường.

Đây là những gì tôi đã cố gắng và có lỗi biên dịch.

Tên 'screenMode' không tồn tại trong bối cảnh hiện nay

$("#role-detail-form").submit(function (e) { 

    if ($(this).valid()) { 
    var screenMode = 0; 
    @{ 
    if (Model.ScreenMode == UI.ViewModel.ScreenMode.New) 
    { 
     <text> 
     screenMode =2; 
     </text> 
    } 
    } 
    $.post('@Url.Action("SaveRoleDetail", new { mode=screenMode})', 
      $(this).serialize(), function (data) { 
       $("#role-detail").html(data); 
       $.validator.unobtrusive.parse($("#role-detail")); 
      }); 
     } 
     e.preventDefault(); 
    }); 

Hành động của tôi là

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
    { 
    } 

Trả lời

6

Bạn sẽ phải chia mà ra và xây dựng chuỗi truy vấn chính mình, để kết hợp biến Javascript.

Something như thế này là những gì bạn cần:

$.post('@(Url.Action("SaveRoleDetail"))?screenMode=' + screenMode) 

EDIT: Mặc dù thực tế có lẽ là tốt nhất, bạn nên lưu trữ các biến ScreenMode trong Model của bạn, sau đó đặt một HiddenFor theo quan điểm của mình cho nó. Sau đó, bất cứ khi nào bạn thay đổi giá trị trong Javascript, chỉ cần cập nhật giá trị của đầu vào bị ẩn, theo cách đó, phương thức hành động của bạn chỉ cần lấy mô hình xem làm tham số. Nếu bạn đang đăng biểu mẫu trong JavaScript và bạn có thể gọi $("#form").serialize() để gửi tất cả dữ liệu trở lại trong cuộc gọi của bạn.

+0

Tôi có thể vượt qua chuỗi truy vấn này bằng phương pháp sau ajax không? url sẽ trông như thế nào? screenMode sẽ là một phần của thông số bài viết hoặc trong chuỗi truy vấn? –

+0

Vẫn còn tốt hơn, bạn có thể đặt ScreenMode trong mô hình của mình, có ẩn trong chế độ xem, sau đó nếu bạn muốn thay đổi giá trị trong Javascript, bạn có thể chỉ cần cập nhật giá trị của đầu vào bị ẩn, sau đó khi tất cả được thực hiện, $ ("# form"). serialize() ;, theo cách đó, phương thức hành động của bạn chỉ cần lấy mô hình khung nhìn làm tham số :) – mattytommo

+0

Có bạn là chính xác. Bây giờ tôi sử dụng trường ẩn và cập nhật bằng Javascript. Bạn có thể vui lòng thêm thông tin về Trường ẩn này như là một phần của câu trả lời của bạn không. Vì vậy, nó sẽ dễ dàng nhìn thấy và hữu ích cho những người khác quá :) –

0

Nếu bạn sử dụng T4MVC và jQuery, bạn có thể gọi ActionResult làm như sau:

Trong bộ điều khiển:

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
{ 
} 

Trong giao diện:

$.post("@Url.Action(MVC.Home.SaveRoleDetail())", { viewModel: param1, screenMode: param2) }, function (data) { 

     //Do Work 

    }); 
+1

Sẽ rất hữu ích nếu bạn thêm liên kết cho T4MVC và jQuery. Vì vậy, mọi người có thể dễ dàng điều hướng từ đây. Cảm ơn –

+0

Rất tiếc, tôi đã bỏ lỡ các liên kết. Cả hai đều có sẵn như các gói Nuget. Có thể tìm thấy T4MVc tại đây (http: // t4mvc.codeplex.com/) và jQuery ở đây (http://jquery.com/) Hy vọng điều này sẽ giúp. – lopezbertoni

4

Ngoài ra nó có thể tạo một người giữ chỗ và sau đó thay thế nó:

var url = '@Url.Action("GetOrderDetails", "Home", new { id = "js-id" })' 
      .replace("js-id", encodeURIComponent(rowId)); 
+0

Tôi thích phương pháp này – Alireza

Các vấn đề liên quan