ASP.NET MVC Передача данных из представления в контроллер
У меня есть представление с сеткой, содержащей элементы, добавленные на рабочую станцию. Пользователь может выбрать элемент из выпадающего списка и нажать ссылку на действие, которая вызывает контроллер, который добавляет этот элемент на рабочую станцию. Я могу заставить его работать, читая объект FormCollection в действии Post контроллера.
<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!");
}
Что я хочу сделать, так это предоставить два параметра: workstationId и itemId для контроллера с помощью Ajax.ActionLink и добавить новый добавленный элемент в сетку. Я передаю сетку следующим образом:
<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>
Проблема в том, что я отправляю с помощью ActionLink. Я не могу понять, как передать параметры контроллеру и как обновить сетку, не перезагружая весь вид.
Я бы очень признателен за помощь в этом или даже ссылку на учебники, которые делают что-то подобное.
Спасибо!
Это рабочая версия, одна из проблем заключается в том, что, когда контроллер возвращает частичное представление, которое является все, что получает rendred, фактическая страница исчезла.
<% 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>
<% } %>
Не уверен, в чем причина, заменитель работал правильно раньше, но контроллер не получал ниспадающее значение. Теперь контроллер получает значение, но возвращаемое частичное представление заменяет всю страницу.
Метод действия:
[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);
}
Это HTML для представления, который выполняет всю работу:
<%@ 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>
Ответы
Ответ 1
Какой результат вы ожидаете от вызова AJAX?
Вы можете использовать методы AjaxHelper
вместо HtmlHelper
для визуализации ссылки. Например, чтобы получить новый контент с вызовом AJAX HttpPOST и вставить его в <div>
с идентификатором, установленным на ResultsGoHere
, вы выполните следующую ссылку:
<%= Ajax.ActionLink("Edit", "ItemEdit",
new {
itemId = item.RecordId,
workstationId = myWorkStationId
},
new AjaxOptions {
HttpMethod="POST",
UpdateTargetId="ResultsGoHere",
InsertionMode = InsertionMode.Replace
}) %>
В вашем AcionMethod
вы можете просто проверить на Request.IsAjaxRequest()
, чтобы решить, что вернуть:
[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
}
Ответ 2
Вот как вы могли бы это сделать, используя метод Ajax.BeginForm()
:
<% 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>
<% } %>
Обратите внимание, что код в текущем состоянии никоим образом не является полностью функциональным - выпадающие списки не получают свои предметы из любого места, нет <div>
, чтобы позаботиться о результатах из запроса AJAX, а onclick
в ссылке, которая отправляет форму, требует включения jQuery (в этом случае лучше указать ссылку id и добавить к ней обработчик события click()
из отдельного файла js
...)
EDIT: О, и я не проверял, что это нормально передать значение null
в параметр routeValues
. Если нет, просто поставьте имена контроллеров и действий, и все будет в порядке.
Ответ 3
как вы можете передать модель из представления в сообщение, создайте действие контроллера с помощью ajax.actionlink?
Ответ 4
Эта ссылка может быть полезна
http://asp-net-csharp-vb.blogspot.com/2011/05/passing-data-in-aspnet-mvc-application.html
Ответ 5
Здесь, насколько я знаю, мы можем передавать данные из View в Controller двумя способами...
-
Используя Formcollection
встроенное ключевое слово, подобное этому.
[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
будет работать только при нажатии любой кнопки внутри формы. В других случаях он содержит только пустые данные
Ответ 6
Вот как вы сможете отправлять несколько параметров через actionLink.
Для этой ситуации см. Следующий код:
@Html.ActionLink("Link text", "Action Name", null, routeValues: new { pram_serviceLine = Model.ServiceLine_ID, pram_Month = Model.Month, pram_Year = Model.Year, flag = "ROTATION" }
Ответ, если он работает.