2009-06-18 46 views
12

Tôi có chế độ xem với lưới có chứa các mục được thêm vào máy trạm. Người dùng có thể chọn một mục từ danh sách thả xuống và nhấp vào liên kết hành động gọi một bộ điều khiển để thêm mục đó vào máy trạm. Tôi có thể làm cho nó hoạt động bằng cách đọc đối tượng FormCollection trong hành động Post của controller.ASP.NET MVC Truyền Dữ liệu từ Xem tới Bộ điều khiển

<p> 
    <% using(Html.BeginForm("AddItem", "Home")) { %> 
    <label for="ItemID">Item:</label> 
    <%= Html.DropDownList("ItemID", Model.ItemsList) %> 
    <%= Html.Hidden("WorkstationID", Model.Workstation.RecordID) %> 
    <input type="submit" value="Submit" /> 
    <% } %> 
</p> 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddItem(FormCollection formValue) 
{ 
    long workstationId = Convert.ToInt64(formValue["WorkstationID"]); 
    long itemId = Convert.ToInt64(formValue["ItemID"]); 

    Workstation workstation = itilRepository.FindWorkstation(workstationId); 
    Item item = itilRepository.FindItem(itemId); 

    itilRepository.AddItem(workstation, item); 
    itilRepository.Save(); 

    return Content("Item added successfully!"); 
} 

Những gì tôi muốn làm là có thể gửi hai thông số các workstationId và ItemID với bộ điều khiển sử dụng Ajax.ActionLink và có mục mới đã được thêm vào được đưa vào lưới điện . Tôi render lưới như thế này:

<table> 
     <tr> 
     <th></th> 
     <th> 
     Name 
     </th> 
     <th> 
     Service Tag 
     </th> 
     <th> 
     Serial Number 
     </th> 
    </tr> 

    <% foreach (var item in Model.Items) { %> 

    <tr> 
     <td> 
     <%= Html.ActionLink("Edit", "ItemEdit", new { id = item.RecordID }) %> | 
     <%= Html.ActionLink("Details", "ItemDetails", new { id = item.RecordID })%> 
     </td> 
     <td> 
     <%= Html.Encode(item.Name) %> 
     </td> 
     <td> 
     <%= Html.Encode(item.ServiceTag) %> 
     </td> 
     <td> 
     <%= Html.Encode(item.SerialNumber) %> 
     </td> 
    </tr> 

    <% } %> 

</table> 

Vấn đề tôi có được khi tôi gửi bằng cách sử dụng ActionLink tôi không thể tìm ra cách để vượt qua trong các thông số để điều khiển và làm thế nào để cập nhật các lưới mà không cần tải lại toàn bộ khung nhìn.

Tôi thực sự đánh giá cao một số trợ giúp về điều này hoặc thậm chí là liên kết đến hướng dẫn thực hiện điều gì đó tương tự.

Cảm ơn bạn!

Đây là phiên bản làm việc, một vấn đề là khi bộ điều khiển trả về một phần xem tất cả được hiển thị, trang thực sự đã biến mất.

<% using (Ajax.BeginForm("AddItem", null, 
     new AjaxOptions 
     { 
      UpdateTargetId = "ResultsGoHere", 
      InsertionMode = InsertionMode.Replace 
     }, 
     new { @id = "itemForm" })) 
{ %> 

    <label for="ItemID">Item:</label> 
    <%= Html.DropDownList("itemId", Model.ItemsList) %> 
    <%= Html.Hidden("workstationId", Model.Workstation.RecordID) %> 

    <a href="#" onclick="$('#itemForm').submit();">Submit</a> 

    <div id="ResultsGoHere"> 
     <% Html.RenderPartial("WorkstationItems", Model.Items); %> 
    </div> 

<% } %> 

Không chắc chắn nguyên nhân là, thay thế hoạt động chính xác trước đó nhưng bộ điều khiển không nhận được giá trị thả xuống. Bây giờ bộ điều khiển nhận được giá trị nhưng khung nhìn một phần được trả về sẽ thay thế toàn bộ trang.

Phương pháp hành động:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddItem(string workstationId, string itemId) 
{ 
    long lworkstationId = Convert.ToInt64(workstationId); 
    long litemId = Convert.ToInt64(itemId); 

    Workstation workstation = itilRepository.FindWorkstation(lworkstationId); 
    Item item = itilRepository.FindItem(litemId); 

    IQueryable<Item> items = itilRepository.AddItem(workstation, item); 
    itilRepository.Save(); 

    return PartialView("WorkstationItems", items); 
} 

Đây là HTML cho Xem mà làm tất cả các công việc:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ITILDatabase.Models.WorkstationFormViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Workstation Details 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
    <script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
    <link type="text/css" href="/../Content/css/ui-lightness/jquery-ui-1.7.2.custom.css" rel="stylesheet" />  
    <script type="text/javascript" src="/../Content/js/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript" src="/../Content/js/jquery-ui-1.7.2.custom.min.js"></script> 

    <h2> 
     Workstation Details</h2> 
    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      Record ID: 
      <%= Html.Encode(Model.Workstation.RecordID) %> 
     </p> 
     <p> 
      Name: 
      <%= Html.Encode(Model.Workstation.Name) %> 
     </p> 
     <p> 
      Description: 
      <%= Html.Encode(Model.Workstation.Description) %> 
     </p> 
     <p> 
      Site: 
      <%= Html.Encode(Model.Workstation.Site.Name) %> 
     </p> 
     <p> 
      Modified By: 
      <%= Html.Encode(Model.Workstation.ModifiedBy) %> 
     </p> 
     <p> 
      Modified On: 
      <%= Html.Encode(String.Format("{0:g}", Model.Workstation.ModifiedOn)) %> 
     </p> 
     <p> 
      Created By: 
      <%= Html.Encode(Model.Workstation.CreatedBy) %> 
     </p> 
     <p> 
      Created On: 
      <%= Html.Encode(String.Format("{0:g}", Model.Workstation.CreatedOn)) %> 
     </p> 
    </fieldset> 
    <fieldset> 
     <legend>People</legend> 
     <% Html.RenderPartial("WorkstationPeople", Model.People); %> 
    </fieldset> 
    <fieldset> 
     <legend>Positions</legend> 
     <% Html.RenderPartial("WorkstationPositions", Model.Positions); %> 
    </fieldset> 
    <fieldset> 
     <legend>Items</legend> 

      <% using (Ajax.BeginForm("AddItem", "Home", null, 
        new AjaxOptions 
        { 
         UpdateTargetId = "ResultsGoHere", 
         InsertionMode = InsertionMode.Replace 
        }, 
        new { @id = "itemForm" })) 
      { %> 

       <label for="ItemID">Item:</label> 
       <%= Html.DropDownList("itemId", Model.ItemsList) %> 
       <%= Html.Hidden("workstationId", Model.Workstation.RecordID) %> 

       <a href="#" onclick="$('#itemForm').submit();">Submit</a> 

       <div id="ResultsGoHere"> 
        <% Html.RenderPartial("WorkstationItems", Model.Items); %> 
       </div> 

      <% } %> 
    </fieldset> 
    <br /> 
    <p> 
     <%=Html.ActionLink("Edit", "WorkstationEdit", new { id = Model.Workstation.RecordID }) %> 
     | 
     <%=Html.ActionLink("Back to List", "Index") %> 
    </p> 
</asp:Content> 

Trả lời

15

kết quả gì là bạn mong đợi từ AJAX gọi?

Bạn có thể sử dụng phương thức trợ giúp của đối tượng AjaxHelper thay vì HtmlHelper để hiển thị liên kết. Ví dụ, để có được nội dung mới với một HttpPOST gọi AJAX và chèn nó vào một <div> với id thiết lập để ResultsGoHere bạn render liên kết sau:

<%= Ajax.ActionLink("Edit", "ItemEdit", 
         new { 
          itemId = item.RecordId, 
          workstationId = myWorkStationId 
         }, 
         new AjaxOptions { 
          HttpMethod="POST", 
          UpdateTargetId="ResultsGoHere", 
          InsertionMode = InsertionMode.Replace 
         }) %> 

Trong AcionMethod của bạn, bạn chỉ có thể thử nghiệm trên Request.IsAjaxRequest() để quyết định những gì trở về:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ItemEdit(string itemId, string workstationId) { 
    // edit the item and get it back 

    if (Request.IsAjaxRequest()) { 
     return PartialView("SingleItem", item); 
    } 
    return RedirectToAction("ItemEdit", new { itemId = item.RecordId, workstationId = workstationId }); 
} 

// fallback for get requests 
public ActionResult ItemEdit(string itemId, string workstationId) 
{ 
    // do stuff and return view 
} 
+0

Điều này thật tuyệt! Tôi vẫn còn có một vấn đề, làm thế nào để vượt qua hai Id của bộ điều khiển? Tôi cần phải vượt qua trong workstationId và itemId. Làm cách nào để kéo mục ItemId đã được chọn trong trình đơn thả xuống và sử dụng nó trong Liên kết hành động? – Lukasz

+0

Bạn chỉ có thể thêm tham số đầu vào vào hành động, và thêm nó vào các giá trị tuyến đường. Nếu bạn muốn nhận được một url đẹp cho cuộc gọi, bạn sẽ cần phải thêm một tuyến đường tương ứng. Tôi đã chỉnh sửa mã của mình cho phù hợp. –

+0

Một câu hỏi cuối cùng, làm cách nào để có danh sách thả xuống được chọn trong giá trị Ajax.ActionLink? – Lukasz

2

Đây là cách bạn có thể làm điều đó bằng cách sử dụng phương pháp Ajax.BeginForm() thay vì:

<% using (Ajax.BeginForm("ItemEdit", null, new AjaxOptions 
      { 
       UpdateTargetId = "ResultsGoHere", 
       InsertionMode = InsertionMode.Replace 
      }, new { @id = "itemForm" }) 
{ %> 
<p> 
    <%= Html.DropDownList("itemId") %></p> 
<p> 
    <%= Html.DropDownList("workstationId") %></p> 
<p> 
    <a href="#" onclick="$('#itemForm').submit();">Submit</a> 
</p> 
<% } %> 

Xin lưu ý rằng mã đang ở trạng thái hiện tại không có cách nào đầy đủ chức năng - danh sách thả xuống không nhận được các mục từ bất kỳ đâu, không có <div> để xử lý các kết quả từ yêu cầu AJAX và thuộc tính onclick trên liên kết gửi biểu mẫu yêu cầu jQuery được bao gồm (trong trường hợp đó là cách tốt hơn để cung cấp cho liên kết một id và thêm một xử lý sự kiện click() cho nó từ một tệp riêng biệt js ...)

EDIT: Ồ, và tôi chưa xác minh rằng bạn có thể chuyển giá trị null cho thông số routeValues. Nếu không, chỉ cần cung cấp tên bộ điều khiển và hành động, và bạn sẽ ổn.

+0

Tôi đã thêm mã vào cuối câu hỏi của mình. – Lukasz

+0

HTML hiển thị của bạn trông như thế nào? Và ActionMethod của bạn? –

+0

HTML chỉ là mã từ chế độ xem từng phần. Ngoài ra url là/Home/WorkstationDetail/1 và sau bài viết là/Home/AddItem – Lukasz

0

cách bạn có thể chuyển mô hình từ chế độ xem tới bài đăng tạo hành động của bộ điều khiển bằng cách sử dụng ajax.actionlink?

0

Ở đây, như hiểu biết của tôi, chúng ta có thể truyền dữ liệu từ Xem đến controller trong hai cách ...

  1. Sử dụng Formcollection xây dựng vào từ khóa như thế này ..

    [HttpPost] 
    public string filter(FormCollection fc) 
    { 
        return "welcome to filtering : "+fc[0]; 
            (or) 
        return "welcome to filtering : "+fc["here id of the control in view"]; 
    
    } 
    

FormCollection sẽ chỉ hoạt động khi bạn nhấp vào bất kỳ nút nào bên trong biểu mẫu. Trong những trường hợp khác, nó chỉ chứa dữ liệu rỗng

  1. Sử dụng mô hình lớp

    [HttpPost] 
    public string filter(classname cn) 
    { 
        return "welcome to filtering : "+cn.Empid+""+cn.Empname; 
    } 
    
0

Đây là cách bạn sẽ có thể gửi nhiều thông số thông qua ActionLink.
Đối với tình huống này vui lòng tham khảo đoạn code dưới đây:

@Html.ActionLink("Link text", "Action Name", null, routeValues: new { pram_serviceLine = Model.ServiceLine_ID, pram_Month = Model.Month, pram_Year = Model.Year, flag = "ROTATION" } 

Reply nếu nó hoạt động.

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