2010-04-16 30 views
10

Tôi đang sử dụng jQuery.load() để hiển thị chế độ xem một phần. Phần này trông như thế này:ASP.NET MVC 2 tải một phần xem bằng cách sử dụng jQuery - không có xác thực phía máy khách

$('#sizeAddHolder').load(
       '/MyController/MyAction', function() { ... }); 

Mã cho hành động trong bộ điều khiển của tôi là như sau:

public ActionResult MyAction(byte id) 
    { 
     var model = new MyModel 
     { 
      ObjectProp1 = "Some text" 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult MyAction(byte id, FormCollection form) 
    { 
     // TODO: DB insert logic goes here 

     var result = ...; 

     return Json(result); 
    } 

Tôi đang trở về một lần xem một phần mà trông giống như sau:

<% using (Html.BeginForm("MyAction", "MyController")) {%> 
    <%= Html.ValidationSummary(true) %> 

    <h3>Create my object</h3> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp1) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Size.ObjectProp1) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp1) %> 
     </div> 

     div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp2) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.ObjectProp2) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp2) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

Xác nhận phía máy khách không hoạt động trong trường hợp này. Hơn nữa, tập lệnh chứa thông báo xác thực cũng không được bao gồm trong chế độ xem được trả lại. Cả hai thuộc tính trong lớp mô hình của tôi đều có các thuộc tính RequiredStringLength. Có cách nào để kích hoạt xác thực phía máy khách trong chế độ xem đã được tải như thế này không?

Trả lời

7

Trước hết, bạn phải trả lại một phần lượt xem chứ không phải dạng xem.

return PartialView(model); 

Thứ hai, bạn đang cố tải chế độ xem một phần này bằng AJAX? Trong trường hợp đó bạn có thể muốn sử dụng jquery.ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 
+2

Cảm ơn bạn đã thông tin có giá trị. Tôi đã sửa chữa những lỗi này nhưng điều đó không thực sự tạo ra sự khác biệt. Html rendered là giống hệt nhau trong cả hai trường hợp vì 'load()' nhận html giống như cách 'ajax()' sử dụng XMLHttpRequest và 'return View (model)' nếu theres no SomeAction.aspx sẽ trả về SomeAction.ascx . Hãy xem tại đây: http://stackoverflow.com/questions/2043394/what-is-the-difference-between-a-view-and-a-partialview-in-asp-net-mvc Vì vậy, vấn đề chính là vẫn ở đó: không xác thực phía khách hàng; không có tập lệnh nào chứa thông báo xác thực .. –

+1

Đoạn mã trên không giải quyết được vấn đề ban đầu –

+1

anh ta cũng có thể trả về Chế độ xem, nó không thực sự quan trọng miễn là chế độ xem mà anh ấy quay lại không sử dụng cùng một trang chính như nơi nó được gọi là – Omu

2

Bạn nên sử dụng datatype trên gọi ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    dataType: "html", 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 

Từ jQuery docs:

datatype Mặc định: Intelligent Guess (xml, json, kịch bản , hoặc html)

Loại dữ liệu bạn đang mong đợi từ máy chủ. Nếu không có quy định nào, jQuery sẽ thông minh cố gắng để có được kết quả, dựa trên kiểu MIME của phản hồi (một kiểu MIME XML sẽ tạo ra XML, trong 1,4 JSON sẽ sinh ra một đối tượng JavaScript, trong kịch bản 1.4 sẽ thực thi kịch bản và bất cứ thứ gì khác sẽ được trả về dưới dạng chuỗi). Các loại có sẵn (và kết quả thông qua như là đối số đầu tiên để gọi lại thành công của bạn) là:

* "xml": Returns a XML document that can be processed via jQuery. 
* "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM. 
* "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching unless option "cache" is used. Note: This will turn POSTs into GETs for remote-domain requests. 
* "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.) 
* "jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback. 
* "text": A plain text string. 
+0

Cảm ơn thông tin này. Vấn đề là trong một trường hợp tôi muốn trả lại html (khi dữ liệu được truyền không hợp lệ - vì xác nhận hợp lệ phía máy khách không thành công ..) để người dùng có thể thực hiện thay đổi và đăng lại. Nhưng khi dữ liệu được xác nhận hợp lệ và một đối tượng mới trong cơ sở dữ liệu đã được tạo thành công thì tôi muốn trả về Json. Có cách nào để kiểm tra loại kết quả trả về không? –

+0

Thử đặt kiểu trả lời MIME: * Nếu không có quy định cụ thể nào, jQuery sẽ thông minh cố gắng lấy kết quả, dựa trên kiểu trả lời MIME * –

+0

Tôi tin đây là hành vi mặc định và "nếu không có quy định" trong trường hợp này có nghĩa là "nếu bạn không đặt nó rõ ràng" thay vì "đặt nó thành không". – bszom

1

Vấn đề là biểu mẫu được nạp với ajax không bao giờ được đăng ký với xác nhận của Microsoft. Để giải quyết nó gọi hàm sau Sys.Mvc.FormContext._Application_Load.

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
     Sys.Mvc.FormContext._Application_Load(); 
    } 
    return false; 
} 

Điều đó sẽ khắc phục. Ngoài ra, hãy đảm bảo rằng các biểu mẫu bạn tải qua ajax có id duy nhất. Nếu không, việc xác thực sẽ thất bại.

Tránh sử dụng tải(). Nó loại bỏ bất kỳ tập lệnh nào được tải trong phản hồi.

0

Trong file html bạn có thể có một cái gì đó như:

xin lỗi về điều đó nhưng tôi không không có cách viết html link.Vì vậy, bạn có thể có một liên kết lớp = "xóa", id = giá trịhref = "javascript :;"

Sau đó, tôi đã sử dụng chức năng này để làm cho một cái nhìn cục bộ:

$(".delete").click(function(event){ 
      var id = $(".select").attr("id"); 
      var id2 = event.target.id; 
      $.ajax({ 
       url: "Persona/Delete?idPersona=" + id2.toString(), 
       success: function (data) { 
        $("#popUpConfirmar").html(data); 
       } 
      }); 

      dialogoPopUp.dialog("open"); 
     }); 

Ghi trong ứng dụng điều khiển bạn phải có một hành động như:

public PartialViewResult Delete(int idPersona) 
    { 
     PersonaDataAccess personaDataAccess = new PersonaDataAccess(); 
     Persona persona = personaDataAccess.GetOne(idPersona); 
     return PartialView("Delete",persona); 
    } 
Các vấn đề liên quan