2012-11-23 23 views
9

Tôi có cảm giác đây có thể là một câu hỏi cơ bản!Cách duy trì một đối tượng phức tạp trong Chế độ xem trong khi cập nhật chỉ một phần nhỏ

Tôi có đối tượng phức tạp tức là đối tượng tài liệu có chứa các thuộc tính là danh sách các đối tượng khác. Nó đã được tạo ra bằng cách deserializing một số XML.

Tôi muốn vượt qua toàn bộ mẫu cho View

Return ViewResult(MyDoc) 

Trong Xem một số tính chất được chỉnh sửa. Kiểm soát sau đó được trả lại cho Trình điều khiển bài đăng:

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(Document myDoc) 

"myDoc" hiện chỉ đại diện cho các trường của biểu mẫu của tôi. Tôi nghi ngờ đây là ModelBinding tại nơi làm việc. Vì vậy, tôi đoán tôi cần phải kiên trì đối tượng phức tạp của tôi trong một lĩnh vực ẩn (ví dụ sẽ là tuyệt vời) hoặc là một đối tượng phiên. Tuy nhiên tôi là một chút bối rối như thế nào lĩnh vực cập nhật của tôi được sáp nhập trở lại vào đối tượng kiên trì (ẩn hoặc phiên).

Trả lời

3

Bạn nói đúng, đây là mô hình ràng buộc tại nơi làm việc.

Các ràng buộc xảy ra gần như tự động khi bạn sử dụng HtmlHelpers như:

@Html.TextboxFor(model => model.PropertyName) 

Dòng này thực sự tạo ra một cái gì đó một chút như thế này:

<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" /> 

Sau đó, khi bạn gửi mẫu của bạn, các DefaultModelBinder có thể deserialize giá trị POST và tạo và đối tượng của kiểu đã cho (ít nhất nó sẽ thử), nếu nó không thể tìm thấy một mục tương ứng, thuộc tính sẽ rỗng và nếu một mục không có thuộc tính tương ứng, nó sẽ là bỏ qua (trừ khi yo u có các thông số khác).

Bạn có thể đọc số này article hơi cũ nhưng vẫn khá chính xác.

Là một dụ:

Hãy nói rằng bạn có một đối tượng đơn giản:

public class IndexModel 
{ 
    public string MyProperty { get; set; } 
    public bool MyCheckbox { get; set; } 
} 

Một khiển đơn giản:

public class TestingController : Controller 
{ 
    [OutputCache(Duration=0, NoStore = true)] 
    public ActionResult Index() 
    { 
     return View(new IndexModel { MyProperty = "hi" }); 
    } 

    [HttpPost] 
    [OutputCache(Duration=0, NoStore = true)] 
    public ActionResult Index(IndexModel model) 
    { 
     model.MyProperty += "!"; 
     ModelState.Clear(); 
     return View(model); 
    } 
} 

Và một cái nhìn đơn giản:

@model MvcApp.Models.IndexModel 

@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(model => model.MyProperty)<p /> 
     @Html.TextBoxFor(model => model.MyProperty) 
    </div> 
    <div> 
     @Html.LabelFor(model => model.MyCheckbox)<p /> 
     @Html.CheckBoxFor(model => model.MyCheckbox) 
    </div> 

    <input type="submit" /> 
} 

Bạn sẽ thấy, khi y gửi biểu mẫu, rằng mô hình được tạo lại hoàn toàn.

Nếu bạn không muốn hiển thị giá trị thực tế của một bất động sản, nhưng vẫn cần nó tiếp tục tồn:

@Html.HiddenFor(model => model.MyProperty) 

này sẽ tạo ra một lĩnh vực tiềm ẩn sẽ được đăng lại và, do, vẫn kiên trì.

Mã hóa vui vẻ!

+1

Hi Lostdreamer, Một câu trả lời toàn diện và hữu ích nhất. Tôi đồng ý đây là cách tôi cần phải đi và bình luận trước của tôi với các tiểu bang Pablo. Tôi muốn đánh dấu cả hai câu trả lời đều hữu ích. Không chắc chắn nếu tôi có thể làm điều này. Hug cảm ơn một lần nữa. Ed – EdB

5

Việc lưu trữ đối tượng lớn đó trong chế độ xem hoàn toàn cần thiết phải không?

View dường như không có quyền kiểm soát nội dung đó, vì vậy có thể bạn không muốn gửi tất cả dữ liệu đó đến View. Có vẻ như bạn đang áp dụng bộ tư duy dựa trên ViewState, không thực sự phù hợp với MVC, IMHO.

Giao tiếp giữa ViewController được thực hiện qua ViewModels và thường không cần phải lưu trữ bất kỳ dữ liệu tuần tự lớn nào và thực hiện điều đó qua lại khi tương tác với máy chủ.

bạn không thể tạo một ViewModel mà chỉ đại diện cho dữ liệu hữu ích cho xem (các lĩnh vực), và nhận được dữ liệu trở lại trong Action của bạn bằng cách nhận được ViewModel trong quá trình POST, và sau đó đồng bộ hóa thông tin mà bạn thu được từ Xem với những gì bạn tải từ XML của bạn chỉ vào thời điểm đó?

+0

Pablo, bạn đã đúng. Bây giờ tôi đã tạo ra một mô hình xem và điều này hoạt động tốt. Tôi bây giờ cần phải làm việc ra một cách tốt để tạo/duy trì tất cả các ViewModels vì sẽ có khá nhiều trên một mô hình tài liệu. Tuy nhiên tôi đoán nó cũng sẽ cung cấp cho tôi với một lớp bổ sung xác nhận (thông qua chú thích) và tôi nghi ngờ một lợi thế hiệu suất vì một là chỉ di chuyển ViewModels xung quanh. Tuy nhiên, tôi vẫn cần duy trì Mô hình tài liệu qua một phiên hoặc deserialize nó mỗi khi tôi cần nó. Nhưng đây là dựa trên máy chủ và do đó có thể kiểm soát nhiều hơn mạng. Cảm ơn. Ed – EdB

+2

Xin chào Pablo, Cả hai câu trả lời là chính xác vì những lý do khác nhau đối với tôi, nhưng tôi không thể đánh dấu cả hai. Tuy nhiên tôi đã đánh dấu cả hai. Cảm ơn nhiều. Ed – EdB

+0

Tuyệt vời, cảm ơn :) –

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