【问题标题】:ASP.NET MVC Passing Data from View to ControllerASP.NET MVC 将数据从视图传递到控制器
【发布时间】:2009-06-18 15:44:40
【问题描述】:

我有一个带有网格的视图,其中包含添加到工作站的项目。用户可以从下拉列表中选择一个项目并单击一个动作链接,该链接调用一个控制器,该控制器将该项目添加到工作站。我可以通过在控制器的 Post 操作中读取 FormCollection 对象来使其工作。

<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!");
}

我想要做的是能够使用 Ajax.ActionLink 将工作站 ID 和 itemId 这两个参数提交给控制器,并将添加的新项目插入到网格中。我正在像这样渲染网格:

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    您期望 AJAX 调用的结果是什么?

    您可以使用AjaxHelper 对象的辅助方法而不是HtmlHelper 来呈现链接。例如,要使用 AJAX HttpPOST 调用获取新内容并将其插入到 id 设置为 ResultsGoHere&lt;div&gt; 中,请呈现以下链接:

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

    【讨论】:

    • 这太棒了!我还有一个问题,如何将两个 Id 传递给控制器​​?我需要传入stationId 和itemId。如何拉出在下拉菜单中选择的 itemId 并在 Action Link 中使用?
    • 您可以在actionmethod中添加一个输入参数,然后将其添加到路由值中。如果你想获得一个不错的调用 url,你需要添加一个相应的路由。我已经相应地编辑了我的代码。
    • 最后一个问题,如何在 Ajax.ActionLink 中获取下拉列表选择值?
    • 实际上,使用 Ajax.BeginForm() 方法创建一个小的 html 表单元素可能会更容易,您可以使用 ajax 请求发布该表单元素。我将在另一篇文章中写一个替代答案,您可以选择最适合您的答案作为接受的答案。
    【解决方案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>
    <% } %>
    

    请注意,代码处于当前状态,无法完全发挥作用 - 下拉列表不会从任何地方获取它们的项目,没有 &lt;div&gt; 来处理 AJAX 请求的结果,而 @提交表单的链接上的 987654324@ 属性要求包含 jQuery(在这种情况下,最好给链接一个 id 并从单独的 js 文件中添加一个 click() 事件处理程序...)

    编辑:哦,我还没有验证可以将null 值传递给routeValues 参数。如果没有,只需提供控制器和操作名称,就可以了。

    【讨论】:

    • 呈现的 HTML 是什么样的?你的 ActionMethod 呢?
    • HTML 只是部分视图的代码。网址也是 /Home/WorkstationDetail/1 ,帖子之后是 /Home/AddItem
    • 我的意思是 HTML 之前你做 POST - 也就是说,整个表单等如何在你的机器上呈现。
    • 我已经添加了视图的源代码。感谢所有的帮助,我真的很感激。
    • 我修复了它,如果我使用常规输入按钮它工作正常。一定和java脚本有关。
    【解决方案3】:

    如何使用 ajax.actionlink 将模型从视图传递到控制器的创建后操作?

    【讨论】:

      【解决方案4】:

      据我所知,我们可以通过两种方式将数据从 View 传递到 Controller...

      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;
        }
        

      【讨论】:

        【解决方案5】:

        这就是您可以通过 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" }
        

        如果有效,请回复。

        【讨论】:

          猜你喜欢
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多