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>
Đ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
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. –
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