2014-10-30 19 views
39

Tôi có một ứng dụng MVC hiển thị một giá trị. Đây là bộ điều khiển:TextBoxĐể hiển thị giá trị ban đầu, không phải giá trị được cập nhật từ mã

public ActionResult Index(DataSites DataSiteList) 
{ 
    if (DataSiteList.Latitude != null) 
    { 
     DataSites test = new DataSites(); 
     test.Latitude = "LATITUDE"; 

     return View(test); 
    } 
    return View(DataSiteList); 
} 
public ActionResult SomeInformation() 
{ 
    DataSites test1 = new DataSites(); 
    test1.Latitude = "LATITUDE2"; 

    return RedirectToAction("Index", test1); 
} 

The View:

@model miniproj2.Models.DataSites 

<p> 
    @Html.TextBoxFor(x => x.Latitude) 
</p> 

Và Model:

public class DataSites 
{ 
    public string Latitude { get; set; } 
} 

Khi tôi đi đến/Trang chủ/SomeInformation, các DataSites 'Latitude tài sản được thiết lập để "LATITUDE2". Sau đó chuyển hướng đến hành động Index() trong trình điều khiển, đặt thuộc tính thành "LATITUDE" và trả về chế độ xem.

Khi hiển thị chế độ xem, nó hiển thị giá trị "LATITUDE2" như được đặt trong chuyển hướng. Không nên "LATITUDE" được hiển thị?

+0

Cài đặt fiddler và xem điều gì thực sự xảy ra khi bạn gọi 'RedirectToAction' - câu trả lời của bạn ở đó. – asawyer

+0

Tôi không bao giờ sử dụng Fiddler, bạn có thể cho tôi một lời giải thích không? –

+1

'DataSiteList.Altitude! = Null' có phải là lỗi chính tả hoặc thuộc tính' độ cao 'thực sự tồn tại trong mô hình 'DataSites' của bạn không? – Aymeric

Trả lời

81

Vấn đề của bạn là (từng bước)

  1. phương pháp SomeInformation() của bạn đặt giá trị của test1.Latitude thành "LATITUDE2".
  2. Sau đó, bạn chuyển mô hình đó đến phương thức Index() của mình bằng cách sử dụng quá tải của RedirectToAction chấp nhận một đối tượng. Nội bộ này sử dụng hình thức phản ánh để xây dựng một RouteValueDictionary dựa trên các thuộc tính của mô hình của bạn (trong trường hợp này đơn giản là latidute="LATITUDE2").
  3. Khi bạn nhấn Index phương pháp mô hình được ràng buộc bởi các DefaultModelBinder và bây giờ giá trị của DataSiteList.Latitude là "LATITUDE2" (đó là lý do bạn nhập các if khối)
  4. Trong quá trình liên kết, các DefaultModelBinder đặt ModelState giá trị của Latitude thành "LATITUDE2". Bất kỳ nỗ lực nào để đặt giá trị của Latitude hiện bị bỏ qua vì chế độ xem sử dụng giá trị ModelState để hiển thị điều khiển.

Không rõ bạn đang cố gắng làm gì ở đây. Bạn có thể làm cho nó hoạt động như bạn mong đợi bằng cách thêm ModelState.Clear(); làm dòng đầu tiên của phương thức Index(). Điều này xóa tất cả các giá trị hiện tại ModelState mà bạn hiện có thể đặt giá trị thành "LATITUDE".

Nhưng khối if của bạn không có ý nghĩa. Có lẽ bạn chỉ đang thực hiện một số thử nghiệm, nhưng bạn cũng có thể loại bỏ tham số khỏi phương thức Index() và chỉ khởi tạo một thể hiện mới là DataSites trong phương thức.

Sửa

Để cung cấp thêm một chút thông tin là tại sao cập nhật một tính chất mô hình đã không ảnh hưởng đến một lần ModelState đã được thiết lập.

Hãy tưởng tượng bạn có biểu mẫu để thu thập thông tin người dùng nơi mô hình chứa int Age.Người dùng được yêu cầu nhập tuổi của họ và ai đó vào "Tôi năm tuần sau!". Tất nhiên điều này sẽ không ràng buộc với một int để DefaultModelBinder thêm giá trị (attemptedValue) và thêm một ModelStateError.

Khi chế độ xem được trả lại, thông thường sẽ hiển thị thông báo lỗi như "Độ tuổi trường phải là số". Nếu trình trợ giúp html hiển thị điều khiển sử dụng giá trị mô hình, thì nó sẽ hiển thị "0" (giá trị mặc định cho int). Nó sẽ hơi khó hiểu cho người dùng thấy "0" trong hộp văn bản và tiếp theo là một thông báo nói rằng nó phải là một số (Cái gì! Nhưng số không là số và những gì xảy ra với những gì tôi nhập?). Vì vậy, thay vào đó, người trợ giúp sử dụng giá trị từ ModelState và giờ đây người dùng thấy "Tôi năm tuần sau!" và thông báo lỗi liên quan có ý nghĩa đối với giá trị.

Vì vậy, ngay cả khi bạn nghĩ rằng "nó không hợp lý", thực sự có một số logic đối với hành vi này.

-5

Bạn không đặt Độ cao. Nó sẽ được null để mã sẽ không bao giờ đi vào khối này và thiết lập Lattitude để "LATTITUDE"

if (DataSiteList.Altitude != null) 
    { 
     DataSites test = new DataSites(); 
     test.Latitude = "LATITUDE"; 

     return View(test); 
    } 
+0

Giá trị của 'Độ cao' ** được thiết lập (trong phương thức' SomeInformation'). Nếu khối 'if' không được nhấn thì khung nhìn sẽ hiển thị một chuỗi trống không phải là" LATITUDE2 "như OP đã nêu. –

+0

Câu trả lời của tôi đã được gửi trước khi OP sửa phần đó của mã. Trước khi nó được sửa, mã đã được thiết lập Latitude và Checking Altitude. Bây giờ, mã đặt Latitude kiểm tra Latitude ... không phải độ cao, như bạn có trong nhận xét của mình. – Keith

+2

Độ cao hoặc Latitude không có sự khác biệt. Điều này hoàn toàn không liên quan gì đến vấn đề của OP. –

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