2009-06-18 5 views
12

У меня есть представление с сеткой, содержащей элементы, добавленные на рабочую станцию. Пользователь может выбрать элемент из выпадающего списка и нажать ссылку на действие, которая вызывает контроллер, который добавляет этот элемент на рабочую станцию. Я могу заставить его работать, читая объект FormCollection в действии Post контроллера.ASP.NET MVC Передача данных из представления в контроллер

<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 я не могу понять, как передать параметры в контроллер и как обновить сетку без перезагрузки весь вид.

Я бы очень признателен за помощь в этом или даже ссылку на учебники, которые делают что-то подобное.

Спасибо!

Это рабочая версия, одна из проблем заключается в том, что когда контроллер возвращает частичный вид, который является все, что получает, фактическая страница исчезла.

<% 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 для View, который делает всю работу:

<%@ 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> 

ответ

15

Какой результат вы ожидаете от AJAX позвонить?

Для отображения ссылки вы можете использовать вспомогательные методы объекта AjaxHelper вместо HtmlHelper. Например, чтобы получить новое содержание с HttpPost вызова AJAX и вставить его в <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 
} 
+0

Это замечательно! У меня все еще есть одна проблема, как передать два идентификатора контроллера? Мне нужно передать в workstationId и itemId. Как вытащить элемент item, который был выбран в раскрывающемся списке и использовать его в Action Link? – Lukasz

+0

Вы можете просто добавить входной параметр к методу action и добавить его к значениям маршрута. Если вы хотите получить хороший URL-адрес для вызова, вам нужно будет добавить соответствующий маршрут. Я отредактировал свой код соответственно. –

+0

Последний вопрос, как получить выпадающий список выбранного значения внутри Ajax.ActionLink? – Lukasz

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. Если нет, просто поставьте имя контроллера и действия, и все будет в порядке.

+0

Я добавил еще код в конце своего вопроса. – Lukasz

+0

Как выглядит ваш визуализированный HTML? И ваш ActionMethod? –

+0

HTML - это всего лишь код с частичного просмотра. Кроме того, url был/Home/WorkstationDetail/1 и после публикации/Home/AddItem – Lukasz

0

Как вы можете передать модель с точки зрения сообщения, чтобы создать действие контроллера с помощью ajax.actionlink?

0

Здесь, как мне известно, мы можем передавать данные из View контролеру двумя способами ...

  1. Использование 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 будет работать только при нажатии любой кнопки внутри формы. В других случаях она содержит только пустые данные

  1. Использование модели класса

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

Это, как вы будете иметь возможность отправить несколько параметров через 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" } 

Ответить, если он работает.

Смежные вопросы