Вопрос по asp.net-mvc – ASP.NET MVC Передача данных из представления в контроллер

12

У меня есть вид с сеткой, которая содержит элементы, добавленные на рабочую станцию. Пользователь может выбрать элемент из раскрывающегося списка и щелкнуть ссылку действия, которая вызывает контроллер, который добавляет этот элемент на рабочую станцию. Я могу заставить его работать, читая объект 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 я не могу понять, как передать параметры в контроллер и как обновить сетку без перезагрузки всего представления.

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

Благодарю вас!

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

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

Ваш Ответ

5   ответов
0

я контроллера, используя ajax.actionlink?

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 был включен (в этом случае лучше присвоить ссылке идентификатор и добавитьclick() обработчик событий к нему из отдельногоjs файл...)

РЕДАКТИРОВАТЬ: О, и я не подтвердил, что это нормально, чтобы передатьnull значение дляrouteValues параметр. Если нет, просто укажите имя контроллера и действия, и все будет в порядке.

Я добавил источник для просмотра. Спасибо за помощь, я действительно ценю это. Lukasz
Я имел ввиду HTMLbefore вы делаете POST - то есть, как вся форма и т. д. отображается на вашем компьютере.
Как выглядит ваш отрендеренный HTML? А твой ActionMethod?
HTML это просто код с частичного представления. Также URL был / Home / WorkstationDetail / 1 и после сообщения / Home / AddItem Lukasz
Я добавил больше кода в конце моего вопроса. Lukasz
15

Вы могли бы использовать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
}
Вы можете просто добавить входной параметр в метод действия и добавить его в значения маршрута. Если вы хотите получить хороший URL-адрес для вызова, вам нужно добавить соответствующий маршрут. Я соответственно отредактировал свой код.
На самом деле, это может быть проще сделать с помощью метода Ajax.BeginForm () для создания небольшого HTML-элемента формы, который вы публикуете с помощью запроса ajax. Я напишу альтернативный ответ в другом сообщении, и вы сможете выбрать тот, который вам больше подходит, в качестве принятого ответа.
И последний вопрос: как получить выбранное значение в раскрывающемся списке внутри Ajax.ActionLink? Lukasz
Это замечательно! У меня все еще есть одна проблема, как передать два идентификатора в контроллер? Мне нужно перейти в WorkstationId и ItemId. Как вытащить itemId, который был выбран в раскрывающемся списке, и использовать его в Action Link? Lukasz
0


Для этой ситуации, пожалуйста, используйте код ниже:

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

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

0

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

Using Formcollection built in keyword like this..

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

Using model class

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

Похожие вопросы