2011-01-27 29 views
12

MVC người mới câu hỏi:MVC: chuyển tham số để xem?

Tôi nhặt một URL có dạng go/{mainnav}/{subnav}, mà tôi đã chuyển thành công đến GoController lớp, phương pháp:

public ActionResult Index(string mainnav, string subnav) { 
    return View(); 
} 

Cho đến nay, như vậy tốt. Nhưng bây giờ tôi muốn xem để trả về HTML khác nhau, tùy thuộc vào giá trị của mainnav hoặc subnav. Cụ thể, bên trong một khối javascript, tôi muốn bao gồm các dòng:

myobj.mainnav = [value of mainnav parameter]; 

chỉ khi subnav không phải là null hoặc rỗng:

myobj.subnav = [value of subnav parameter]; 

Làm thế nào để bạn vượt qua những tham số để một aspx trang không có codebehind?

+1

@ dot.net: Bạn muốn biết dung dịch trong trang aspx hoặc mvc1 hoặc mvc2 hoặc MVC3 hoặc mvc4? –

Trả lời

26

Bạn sử dụng một lớp ViewModel để chuyển dữ liệu:

public class IndexViewModel 
{ 
    public string MainNav { get; set; } 
    public string SubNav { get; set; } 

    public IndexViewModel(string mainnav, string subnav) 
    { 
     this.MainNav = mainnav; 
     this.SubNav = subnav; 
    } 
} 

phương pháp hành động của bạn sau đó đi ra

public ActionResult Index(string mainnav, string subnav) 
{ 
    return View(new IndexViewModel(mainnav, subnav)); 
} 

Điều này có nghĩa tầm nhìn của bạn phải được gõ mạnh:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<YourNameSpace.IndexViewModel>" %> 

Trong chế độ xem của bạn, bạn xuất dữ liệu như sau:

myobj.mainnav = <%: Model.MainNav %>; 

Một giải pháp thay thế nếu bạn sử dụng MVC3, sẽ được sử dụng các động ViewBag:

public ActionResult Index(string mainnav, string subnav) 
{ 
    ViewBag.MainNav = mainnav; 
    ViewBag.SubNav = subnav; 
    return View(); 
} 

đó sẽ được truy cập trong trang như vậy:

myobj.mainnav = <%: ViewBag.MainNav %>; 

Tuy nhiên, tôi sẽ khuyên bạn nên đọc lên trên unobtrusive javascript và xem liệu bạn có thể cải thiện thiết kế của mình để tránh vấn đề cụ thể này không.

0

Nếu tôi hiểu điều này có thể là một giải pháp:

public ActionResult Index(string mainnav, string subnav) 
{ 
    return View(mainnav | subnav); 
} 

Trong Html Xem bạn có thể sử dụng Xem và sau

<%=Model %> 
+0

? Không biên dịch ... | nhà điều hành không áp dụng cho chuỗi –

+0

Không xin lỗi, bỏ lỡ sự hiểu biết, tôi có nghĩa là bạn có thể sử dụng một trong hai chuỗi ... sự lựa chọn được thực hiện bởi chính mình analizing những gì bạn muốn làm (xin lỗi, tiếng anh xấu, tôi là ý). –

+0

Anh ấy muốn chuyển * cả hai * chuỗi sang chế độ xem * cùng một lúc *, hiển thị giải pháp của bạn không đủ. –

3

Nếu bạn đang sử dụng MVC3 tôi sẽ đề nghị thông qua các giá trị vào số ViewBag.

ViewBag.MainNav = "xxxx"; 
ViewBag.SubNav = null; 

sau đó trên trang xem của bạn, nơi bạn xác định JavaScript và thêm giá trị.

nếu bạn không có MVC 3 nếu bạn sử dụng ViewData["MainNav"]), để lưu trữ giá trị của bạn có cùng tác dụng.

1

Tôi đang sử dụng phương pháp sau:

ViewModel.lớp:

public class TitleBodyModel 
{ 
    public string Title { get; set; } 

    public string Body { get; set; } 

    public TitleBodyModel() { Title = Body = ""; } 

    public TitleBodyModel(string t, string b) { this.Title = t; this.Body = b; } 
} 

Trong giao diện chính:

@Html.Partial("_TitleBody" , new XXX.Models.TitleBodyModel("title", "body")) 

Sau đó, trong một lần xem một phần:

@model XXX.Models.TitleBodyModel 


<div class="bl_item"> 
    <div class="bl_title">@Model.Title</div> 

    <div class="bl_body">@Model.Body</div> 
</div> 
2

Bạn đã thử truy cập vào thông số từ yêu cầu theo quan điểm của bạn?

ví dụ:

Request.Params["mainnav"] 

hoặc

Request.Params["subnav"] 

trình trong MVC

+0

Chỉ vì bạn có thể làm điều này, không có nghĩa là bạn nên làm. Trách nhiệm của Bộ điều khiển là thẩm vấn yêu cầu và thu thập dữ liệu để chuyển đến Chế độ xem. Bộ điều khiển nên đưa ra quyết định về nguồn dữ liệu đó ở đâu. Hãy nhớ các nguyên tắc SOLID của bạn mọi người. –

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