ASP.NET MVC 将数据从视图传递到控制器

2024-01-07

我有一个带有网格的视图,其中包含添加到工作站的项目。用户可以从下拉列表中选择一个项目,然后单击一个操作链接,该链接调用控制器将该项目添加到工作站。我可以通过读取控制器的 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 向控制器提交workstationId 和 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>

您期望 AJAX 调用得到什么结果?

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

<%= Ajax.ActionLink("Edit", "ItemEdit", 
                         new {
                             itemId = item.RecordId, 
                             workstationId = myWorkStationId
                         },
                         new AjaxOptions {
                             HttpMethod="POST",
                             UpdateTargetId="ResultsGoHere",
                             InsertionMode = InsertionMode.Replace 
                         }) %>

In your 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 将数据从视图传递到控制器 的相关文章

随机推荐

  • POSIX 队列和 msg_max

    我正在摆弄 POSIX 队列 遇到了一个问题 创建新队列时 我可以指定消息的大小以及队列中可以有多少消息 我的正常限制是 10 如 proc sys fs mqueue msg max 除了在程序执行期间更改它之外 还有一种简单的方法吗 e
  • 节点 8 的推荐 typescript 配置

    如果我想在 Node 8 上使用已编译的源代码 推荐的 typescript 配置是什么 大多数教程使用以下内容tsconfig json compilerOptions target es6 module commonjs 但现在我发现
  • multiprocessing.Queue 的工作示例

    在从这个问题中指出它之后 我正在寻找 multiprocessing Queue 的工作示例 Python 使用多处理器 https stackoverflow com questions 4838738 python utilizing
  • Python 3 中列表内的列表分组

    我有一个字符串列表列表 如下所示 List1 John Doe 1 2 3 Henry Doe 4 5 6 我想变成这样的东西 List1 John Doe 1 2 3 Henry Doe 4 5 6 但我似乎很难这样做 List1 Joh
  • 为什么通用 ICollection 不在 .NET 4.5 中实现 IReadOnlyCollection?

    在 NET 4 5 C 5 中 IReadOnlyCollection
  • UISwipeGestureRecognizer 滑动长度

    知道是否有办法获取滑动手势或触摸的长度 以便我可以计算距离 不可能通过滑动手势获得距离 因为当手势结束时 SwipeGesture 会触发您可以准确访问该位置一次的方法 也许您想使用 UIPanGestureRecognizer 如果您可以
  • 如何从 Azure 数据工厂运行 PowerShell

    I have PowerShell该脚本将复杂的 CSV 文件分割为每 1000 条记录的较小的 CSV 文件 这是代码 i 0 Get Content C Users dell Desktop Powershell Input bigsi
  • SignTool 错误:访问被拒绝

    我正在尝试使用 pfx 文件签署外部 dllSignTool在cmd exe中使用以下代码 SignTool 签名 f MyCert pfx p MyPassword MyControl dll 但是 我不断收到以下错误消息 Done Ad
  • 如何过滤列表

    我正在编写一个简单的函数 从列表中取出任何奇数并返回仅包含偶数的列表 def purify numbers for i in numbers if i 2 0 numbers remove i return numbers print pu
  • 无法从其他应用程序读取 SharedPreferences

    EDITED 我有一个应用程序可以像这样写入 SharedPreferences Context otherAppsContext null try otherAppsContext createPackageContext AfroKey
  • 如何获取 jPlayer 中歌曲当前播放的时间? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用 jPlayer 控件来播放音
  • 在notifyAppWidgetViewDataChanged之后没有调用RemoteViewService中的onDataSetChanged()

    在我的 AppWidgetProvider 类中 我有以下代码onUpdate method Update each of the widgets with the remote adapter for int appWidgetId ap
  • 完美转发、可变参数模板、initializer_list - 一起

    gcc 4 8 1 和 clang 3 3 c 11 功能完整 我需要在某些构造 make shared c 14 make unique 等元素的函数中转发参数 但我对类型推导 转发初始值设定项列表 数组有问题 我需要的工作示例foo f
  • 了解托管 bean/支持 bean [重复]

    这个问题在这里已经有答案了 我正在学习 Java EE 6 我正在尝试掌握它的整体形象 我正在阅读有关 JSF 以及如何添加组件的内容 我正在将组件中的值设置 读取到具有 ManagedBean 注释的 bean 我在正确理解它时遇到一些困
  • 单个变量的线程安全

    我了解线程安全的概念 我正在寻找在尝试保护单个变量时简化线程安全的建议 假设我有一个变量 double aPass 我想保护这个变量 所以我创建了一个互斥体 pthread mutex t aPass lock 现在我可以想到两种好方法 但
  • 导入打字稿时如何在路径中使用变量

    是否可以将变量 或常量 放入路径中 而不是将整个路径写为字符串文字 看起来 Angular 除了字符串文字之外不接受任何内容 import aClass require simpleClass import aComponent from
  • 将 pandas 数据框转换为 pandas 系列

    我需要一些有关数据类型问题的帮助 我正在尝试转换 pandas 数据框 如下所示 timestamp number 2018 01 01 1 2018 02 01 0 2018 03 01 5 2018 04 01 0 2018 05 01
  • 从 NSURLConnection 的响应头中读取数据

    如何从服务器响应中发送的标头中读取数据 我正在使用 NSURLConnection 发送请求 如果 URL 是 HTTP URL 则NSURLResponse您在连接的委托中收到的 connection didReceiveResponse
  • xampp mysql 和 phpmyadmin 不起作用

    昨天我使用 xampp 并使用 apache 和 mysql 服务 今天想启动mysql服务 没成功 我尝试在论坛上搜索解决方案 但找不到任何内容 所以我问你 在 mysql 停止工作后 我在日志文件中找到此消息 2015 10 29 12
  • ASP.NET MVC 将数据从视图传递到控制器

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