2012-07-04 28 views
14

Tôi khá chắc chắn rằng tôi đang làm điều gì sai ở đây. Trong 2 tháng qua, chúng tôi đã phát triển một ứng dụng web bằng cách sử dụng MVC và Razor và chúng tôi không bao giờ nghĩ đến việc sử dụng phần tử biểu mẫu. Bây giờ rất nhiều đã được thực hiện với các trang chủ và các trang con mà nó có nghĩa là tái cấu trúc phần lớn mã của chúng ta để sử dụng phần tử biểu mẫu và kết quả là trong nhiều phần tử biểu mẫu trên một trang.MVC Razor Ẩn các giá trị đầu vào và đi qua

Điều đó sang một bên, trong Asp.Net nếu tôi muốn truy cập bất kỳ điều khiển nào trong mã C# phía sau, tôi chỉ có thể cung cấp cho nó ID = "SomeID" và RUNAT = "SERVER". Sau đó, trong mã của tôi phía sau tôi có thể thiết lập giá trị và tài sản của nó.

Khi tôi làm điều này trong Razor, chúng tôi sử dụng những câu nói như:

<input id="hiddenPostBack" runat="server" type="hidden" /> 

Tại sao tôi không thể truy cập này trong bộ điều khiển? Tôi muốn phát hiện một postback và đặt giá trị thành false nếu đây là lần đầu tiên trang tải, và nếu không, sau đó đặt giá trị thành true. Sau đó, dựa trên điều này, tôi sẽ đọc nó ở phía máy chủ hoặc phía máy khách và làm điều gì đó.

Câu hỏi thực sự của tôi là, làm cách nào để "làm điều gì đó" ở phía máy chủ và phía máy khách mà tôi không có phần tử biểu mẫu. Tôi đã ấn tượng rằng nếu tôi muốn truyền các giá trị từ máy khách đến máy chủ và ngược lại, cách dễ nhất để làm điều này là với một đầu vào bị ẩn. Nhưng tôi chỉ không nhận được làm thế nào để thực hiện điều này với MVC3 và dao cạo.

Cảm ơn trước sự giúp đỡ của bạn.

+0

Không có "Postback" được quản lý trong MVC. Bạn cần sử dụng javascript để quản lý các hành động trên phía máy khách ... –

Trả lời

31

Chuyển từ WebForms sang MVC yêu cầu thay đổi hoàn toàn về mặt biển trong các quy trình logic và não. Bạn không còn tương tác với 'form' cả phía máy chủ lẫn phía máy khách (và thậm chí cả với WebForms bạn không tương tác với phía máy khách). Có thể bạn đã trộn lẫn một chút suy nghĩ ở đó, trong đó với WebForms và RUNAT="SERVER" bạn chỉ đang tương tác với tòa nhà của trang Web.

MVC có phần tương tự ở chỗ bạn có mã phía máy chủ trong việc xây dựng mô hình (dữ liệu bạn cần để xây dựng những gì người dùng sẽ thấy), nhưng một khi bạn đã xây dựng HTML, bạn cần đánh giá cao sự liên kết giữa máy chủ và người dùng không còn tồn tại. Họ có một trang HTML, đúng vậy.

Vì vậy, HTML bạn đang xây dựng là chỉ đọc. Bạn chuyển mô hình qua trang Razor, nó sẽ xây dựng HTML phù hợp với mô hình đó.

Nếu bạn muốn có yếu tố ẩn đặt đúng hoặc sai tùy thuộc vào việc đây có phải là lượt xem đầu tiên hay không bạn cần một bool trong mô hình của bạn và đặt thành True trong Hành động nếu nó phản hồi lên. Điều này có thể được thực hiện bằng cách có các hành động khác nhau tùy thuộc vào yêu cầu là [HttpGet] hay [HttpPost] (nếu thích hợp với cách bạn thiết lập biểu mẫu của bạn: yêu cầu GET cho lượt truy cập đầu tiên và yêu cầu POST nếu gửi biểu mẫu). Ngoài ra, mô hình có thể được đặt thành True khi được tạo (đây sẽ là lần đầu tiên bạn truy cập trang), nhưng sau bạn kiểm tra giá trị là True hoặc False (vì bool mặc định là False khi nó khởi tạo). Sau đó, sử dụng:

@Html.HiddenFor(x => x.HiddenPostBack) 

trong biểu mẫu của bạn, điều này sẽ đặt True ẩn. Khi biểu mẫu được đăng trở lại máy chủ của bạn, mô hình sẽ có giá trị đó được đặt thành True.

Thật khó để đưa ra nhiều lời khuyên hơn điều đó vì câu hỏi của bạn không cụ thể là lý do tại sao bạn muốn thực hiện việc này. Có lẽ điều quan trọng là bạn đọc một cuốn sách hay về việc chuyển sang MVC từ WebForms, chẳng hạn như Pro ASP.NET MVC của Steve Sanderson.

+2

Tôi đồng ý, tôi cần một cuốn sách hay. Tuy nhiên chúng tôi đang phát hành đầu tiên và chỉ muốn có được một cái gì đó ra cửa asap như vậy, như đã giải thích, viết lại các trang để sử dụng các hình thức đúng là không thực tế vào lúc này, nhưng sau đó nó sẽ được xác định. Những gì bạn đã đề xuất là tốt hơn so với những gì tôi đã thấy ở một mức độ nào đó, nhưng nó vẫn có cách tiếp cận của một mô hình và bộ điều khiển/actionresult cho mỗi điều khiển trên một trang xem. Tôi đang đăng lại bằng cách sử dụng các hộp tổ hợp thả xuống và nhấp vào các sự kiện của hộp kiểm hoặc radio và nút thỉnh thoảng. Nhưng javascript xử lý chuyển hướng. Cảm ơn lời đề nghị của bạn. –

0

Trước hết ASP.NET MVC không hoạt động giống như cách mà WebForms thực hiện. Bạn không có toàn bộ điều runat="server". MVC không cung cấp lớp trừu tượng mà WebForms cung cấp. Probabaly bạn nên cố gắng hiểu những gì bộ điều khiển và hành động được và sau đó bạn nên nhìn vào mô hình ràng buộc. Bất kỳ hướng dẫn cấp độ mới bắt đầu nào về MVC đều cho thấy cách bạn có thể truyền dữ liệu giữa máy khách và máy chủ.

+0

Bạn có thể sử dụng ASP Forms trong MVC, tôi nghĩ vậy. Lựa chọn Công cụ Xem là giữa Dao cạo CSHTML hoặc ASP Web Forms. – Rolice

+0

Bạn thực sự có thể, nhưng có bạn nhận thấy các hình thức như vậy không có một mã phía sau nữa. :-) (dễ hiểu như bộ điều khiển là mã mới phía sau). Cảm ơn câu trả lời của bạn. –

-1

Bạn đang làm điều đó sai vì bạn cố gắng ánh xạ WebForms trong ứng dụng MVC.

Không có điều khiển phía máy chủ nào trong MVC. Chỉ có bộ điều khiển HTML (View) và trên back-end. Bạn gửi dữ liệu từ máy chủ đến máy khách bằng cách phương tiện khởi tạo Chế độ xem với mô hình của bạn.

Điều này xảy ra trên yêu cầu HTTP GET đối với tài nguyên của bạn.

[HttpGet] 
public ActionResult Home() 
{ 
    var model = new HomeModel { Greeatings = "Hi" }; 
    return View(model); 
} 

Bạn gửi dữ liệu từ máy khách đến máy chủ bằng cách đăng dữ liệu lên máy chủ . Để làm điều đó xảy ra, bạn tạo một biểu mẫu bên trong chế độ xem của mình và trình xử lý [HttpPost] trong bộ điều khiển của bạn và [HttpPost].

// View 

@using (Html.BeginForm()) { 
    @Htmt.TextBoxFor(m => m.Name) 
    @Html.TextBoxFor(m => m.Password) 
} 

// Constoller 

[HttpPost] 
public ActionResult Home(LoginModel model) 
{ 
    // do auth.. and stuff 
    return Redirect(); 
} 
1

Như bạn đã biết, Asp.Net MVC là một mô hình khác với Asp.Net (biểu mẫu web). Việc truy cập các phần tử biểu mẫu giữa máy chủ và máy khách có cách tiếp cận khác trong Asp.Net MVC.

Bạn có thể đọc thêm tài liệu trên Google này trên web. Bây giờ, tôi sẽ đề nghị sử dụng Ajax để lấy hoặc đăng dữ liệu lên máy chủ. Bạn vẫn có thể sử dụng input type="hidden", nhưng khởi tạo nó với một giá trị từ ViewData hoặc cho Dao cạo, ViewBag.

Ví dụ, điều khiển của bạn có thể trông như thế này:

public ActionResult Index() 
{ 
    ViewBag.MyInitialValue = true; 
    return View(); 
} 

Theo quan điểm của bạn, bạn có thể có một elemet đầu vào đó được khởi tạo bởi các giá trị trong bạn ViewBag:

<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" /> 

Sau đó, bạn có thể truyền dữ liệu giữa máy khách và máy chủ thông qua ajax. Ví dụ, sử dụng jQuery:

$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) { 
    // blah 
}); 

Hoặc bạn có thể sử dụng $.ajax, $.getJSON, $.post tùy thuộc vào yêu cầu của bạn.

+2

Tôi hiểu đề xuất của bạn không phải là cách làm MVC chuẩn. Nhưng tôi bước đầu tìm kiếm một cách tiếp cận nhanh chóng và bẩn thỉu và tôi sẽ đưa ra ví dụ của bạn được giảng dạy nhiều hơn. Sau đó, khi thời gian cho phép tôi sẽ lập trình lại giải pháp của tôi với một tiêu chuẩn tốt hơn nhưng bây giờ tôi cần phải lấy nó ra khỏi cửa. Tôi chưa chắc, nhưng đây có thể là câu trả lời tôi đang tìm kiếm. –

+0

Hãy thử xem. Tôi đã làm điều này cho một số công cụ khác, nhưng cho mục đích của bạn nó có thể là khả thi là tốt. Nó không nhất thiết phải là thực hành tốt nhất, nhưng MVC không cấm sử dụng Ajax dù sao. Chỉ cần không sử dụng kỹ thuật này rộng rãi. –

8

Nếu bạn đang sử dụng Dao cạo, bạn không thể truy cập trực tiếp vào trường, nhưng bạn có thể quản lý giá trị của trường.

Ý tưởng là cách tiếp cận đầu tiên của Microsoft thúc đẩy các nhà phát triển thoát khỏi Phát triển web và làm cho các lập trình viên Desktop dễ dàng (ví dụ) để tạo các ứng dụng web.

Trong khi đó, các nhà phát triển web, không hiểu cách kỳ lạ này của ASP.NET.

Thực tế, đầu vào bị ẩn này được hiển thị ở phía máy khách và ASP không có quyền truy cập vào nó (nó không bao giờ có). Tuy nhiên, trong thời gian bạn sẽ nhìn thấy một cách cướp biển của nó và bạn có thể dựa vào nó, khi bạn nhận được sử dụng với nó. Sự phát triển web khác với Desktop hoặc Mobile.

Mô hình là đơn vị logic của bạn và trường ẩn (và toàn bộ trang xem) chỉ là chế độ xem đại diện của dữ liệu. Vì vậy, bạn có thể dành công việc của bạn trên ứng dụng hoặc logic miền và chế độ xem chỉ đơn giản là phục vụ cho người tiêu dùng - điều đó có nghĩa là bạn không cần truy cập chi tiết và chức năng "động não" trong chế độ xem.

Bộ điều khiển thực sự hoạt động mà bạn cần để quản lý thiết lập ẩn hoặc chung. Mô hình này phục vụ các đặc tính và chức năng đơn vị lôgic cụ thể và khung nhìn chỉ hiển thị nó cho người dùng cuối, đơn giản là nói. Đọc thêm về MVC.

Mẫu

public class MyClassModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string MyPropertyForHidden { get; set; } 
} 

Đây là bộ điều khiển aciton

public ActionResult MyPageView() 
{ 
    MyClassModel model = new MyClassModel(); // Single entity, strongly-typed 
    // IList model = new List<MyClassModel>(); // or List, strongly-typed 
    // ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag 

    return View(model); 
} 

Quan điểm dưới

//This will make a Model property of the View to be of MyClassModel 
@model MyNamespace.Models.MyClassModel // strongly-typed view 
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view 

// ... Some Other Code ... 

@using(Html.BeginForm()) // Creates <form> 
{ 
    // Renders hidden field for your model property (strongly-typed) 
    // The field rendered to server your model property (Address, Phone, etc.) 
    Html.HiddenFor(model => Model.MyPropertyForHidden); 

    // For list you may use foreach on Model 
    // foreach(var item in Model) or foreach(MyClassModel item in Model) 
} 

// ... Some Other Code ... 

Quan điểm với ViewBag:

// ... Some Other Code ... 

@using(Html.BeginForm()) // Creates <form> 
{ 
    Html.Hidden(
     "HiddenName", 
     ViewBag.MyHiddenInputValue, 
     new { @class = "hiddencss", maxlength = 255 /*, etc... */ } 
    ); 
} 

// ... Some Other Code ... 

Chúng tôi đang sử dụng Trình trợ giúp Html để hiển thị trường Ẩn hoặc chúng tôi cũng có thể viết bằng tay - <input name=".." id=".." value="ViewBag.MyHiddenInputValue">.

ViewBag là một loại nhà cung cấp dữ liệu nào đó cho chế độ xem. Nó không hạn chế bạn với mô hình - bạn có thể đặt bất cứ điều gì bạn thích.

+0

Đó là lý do tại sao tôi tham khảo các ví dụ về Dao cạo. – Rolice

+0

@Francis không biết sự khác biệt giữa MVC và Webforms. Dao cạo hoặc ASPX xem động cơ không quan trọng bởi vì ông có thể sử dụng ASPX xem động cơ trong MVC và vẫn phải đối mặt chính xác cùng một vấn đề. –

+0

Tôi đã bắt gặp ý tưởng này rất nhiều. Tuy nhiên, tôi thấy khó mà tin rằng thực tế là tôi nên tạo một mô hình mới và/hoặc kết quả hành động điều khiển cho mọi điều khiển trên trang xem của tôi.Thậm chí nếu nó có thể có nhiều bộ điều khiển cho một trang hoặc kết quả hành động cho một điều khiển trên một trang (theo như tôi biết nó không phải là nhưng tôi mở để được sai), làm thế nào để tôi đi về gọi đó là kết quả hành động trong bộ điều khiển có liên quan. Tôi bối rối với cách tiếp cận này, tuy nhiên cảm ơn bạn đã trả lời. –

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