如何在 MVC 4 中使用 jQuery 更新 List

2024-04-12

我目前正在尝试使用修改后的索引视图创建设置页面。目标是让用户获得所有设置显示并可以更改一个视图中的所有设置并保存所有设置只需一个按钮。应使用 Ajax 更新设置。

我目前的做法:

View:

<script language="javascript">
    $(function() {
        $('#editSettings').submit(function () {
            if ($(this).valid()) {
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result)
                    {
                        alert(result);                       
                    }
                });
            }
            return false;
        });
    });
</script>

[ ... ]

@using (Ajax.BeginForm("Edit", "Settings", new AjaxOptions {UpdateTargetId = "result"}, new { @class = "form-horizontal", @id = "editSettings" } ))
{
    foreach (Setting item in ViewBag.Settings) 
    {
        @Html.Partial("_SingleSetting", item)
    }
    <input type="submit" value="modify" />
}

部分视图加载设置:

        <div class="control-group">
            <label class="control-label">@settingName</label>
            <div class="controls">
                @Html.EditorFor(model => model.Value)
                <span class="help-inline">@settingDescription</span>
            </div>
        </div>

Model:

[Table("Settings")]
public class Setting
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SettingId { get; set; }

    public string Name { get; set; }

    [Required(AllowEmptyStrings = true)]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Value { get; set; }
}

我正在使用设置 ViewBagViewBag.Settings = _db.Settings.ToList();

jQuery 将数据解析为以下方法:

    [HttpPost]
    public ActionResult Edit(IList<Setting> setting)
    {
        Console.WriteLine(setting.Count);
        return Content(""); // Currently for testing purposes only. Breakpoint is set to setting.Count
    }

Count抛出错误,因为设置是null。我很不确定如何解决这个问题。

有人可以给我提示吗?

This https://stackoverflow.com/questions/7419742/how-to-updating-ienumerablemyobject-in-mvcSO 上的主题已经涵盖了不使用 Ajax 更新集合。但我不会明白这一点。

感谢您的帮助。


您正在使用Ajax.BeginForm并使用 jQuery 再次对表单进行 ajax 处理。那没有必要。但代码的真正问题是部分中输入字段的名称。你不尊重naming convention http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx由默认模型绑定器用于绑定到列表。

让我们举一个完整的示例(为了简单起见,删除所有噪音,例如实体框架):

Model:

public class Setting
{
    public int SettingId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

控制器:

public class SettingsController : Controller
{
    public ActionResult Index()
    {
        // No idea why you are using ViewBag instead of view model
        // but I am really sick of repeating this so will leave it just that way
        ViewBag.Settings = Enumerable.Range(1, 5).Select(x => new Setting
        {
            SettingId = x,
            Name = "setting " + x,
            Value = "value " + x
        }).ToList();
        return View();
    }

    [HttpPost]
    public ActionResult Edit(IList<Setting> setting)
    {
        // Currently for testing purposes only. Breakpoint is set to setting.Count
        return Content(setting.Count.ToString()); 
    }
}

View (~/Views/Settings/Index.cshtml):

@using (Html.BeginForm("Edit", "Settings", FormMethod.Post, new { @class = "form-horizontal", id = "editSettings" }))
{
    foreach (Setting item in ViewBag.Settings) 
    {
        @Html.Partial("_SingleSetting", item)
    }
    <input type="submit" value="modify" />
}

@section scripts {
    <script type="text/javascript">
        $('#editSettings').submit(function () {
            if ($(this).valid()) {
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) {
                        alert(result);
                    }
                });
            }
            return false;
        });
    </script>
}

设置部分(~/Views/Settings/_SingleSetting.cshtml):

@model Setting
@{
    var index = Guid.NewGuid().ToString();
    ViewData.TemplateInfo.HtmlFieldPrefix = "[" + index + "]";
}

<input type="hidden" name="index" value="@index" />

<div class="control-group">
    <label class="control-label">@Html.LabelFor(x => x.Name)</label>
    <div class="controls">
        @Html.EditorFor(model => model.Value)
    </div>
</div>

请注意在部分内部如何需要更改 HtmlFieldPrefix 以便 html 帮助程序为您的输入字段生成正确的名称并遵守命名约定。


好吧,现在我们来剪掉ViewCrap并正确地做事(当然,即使用视图模型)。

一如既往,我们从编写视图模型开始:

public class MyViewModel
{
    public IList<Setting> Settings { get; set; }
}

然后我们调整控制器:

public class SettingsController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();

        // you will probably wanna call your database here to 
        // retrieve those values, but for the purpose of my example that
        // should be fine
        model.Settings = Enumerable.Range(1, 5).Select(x => new Setting
        {
            SettingId = x,
            Name = "setting " + x,
            Value = "value " + x
        }).ToList();
        return View(model);
    }

    [HttpPost]
    public ActionResult Edit(IList<Setting> setting)
    {
        // Currently for testing purposes only. Breakpoint is set to setting.Count
        return Content(setting.Count.ToString()); 
    }
}

View (~/Views/Settings/Index.cshtml):

@model MyViewModel

@using (Html.BeginForm("Edit", "Settings", FormMethod.Post, new { @class = "form-horizontal", id = "editSettings" }))
{
    @Html.EditorFor(x => x.Settings)
    <input type="submit" value="modify" />
}

@section scripts {
    <script type="text/javascript">
        $('#editSettings').submit(function () {
            if ($(this).valid()) {
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) {
                        alert(result);
                    }
                });
            }
            return false;
        });
    </script>
}

设置模型的编辑器模板(~/Views/Settings/EditorTemplates/Settings.cshtml):

@model Setting
<div class="control-group">
    <label class="control-label">@Html.LabelFor(x => x.Name)</label>
    <div class="controls">
        @Html.EditorFor(model => model.Value)
    </div>
</div>

现在一切都按惯例进行。无需编写任何 foreach 循环。这@Html.EditorFor(x => x.Settings)Index 视图中的调用分析视图模型的 Settings 属性,并检测到它是某个其他模型的集合(Setting在这种情况下)。因此它将开始循环遍历这个集合并搜索相应的编辑器模板(~/Views/Settings/EditorTemplates/Setting.cshtml) 将自动为该集合的每个元素呈现。因此,您甚至不需要在视图中编写任何循环。除了简化代码之外,现在Html.EditorFor(x => x.Value)编辑器模板中将为输入字段生成正确的名称。

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

如何在 MVC 4 中使用 jQuery 更新 List 的相关文章

  • IE 中的 jQuery .width(val) 错误 - 无效参数

    通过ajax加载内部div book table 后 我想调整正文的宽度以适应更大的内容 var new width parseInt book table css width 407 body width new width 在 FF 和
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • XHR 不起作用,因为“Access-Control-Allow-Origin 不允许来源”

    我正在使用 Rails 3 开发一个 API 服务器 到目前为止 它非常方便 但我一直遇到错误 我不确定这是因为我的 Apache 设置还是 Rails 应用程序 当我尝试执行 HTTP DELETE 或 PUT 请求时http sampl
  • WordPress 插件滑块革命错误

    我无法摆脱以下错误 我激活插件后出现错误 Slider Revolution error could not unzip into the revslider public assets folder please make sure th
  • 从 GitHub 读取代码作为网页中的文本(原始)

    我正在尝试从我的 GitHub 存储库读取一些源代码 C 语言 以在我的网页中显示为文本 我可以通过以下方式访问原始模式下的代码https raw github com https raw github com 我正在使用 jQuery G
  • 仅使用 Jquery 验证的字母

    我尝试了文章中的每个解决方案one https stackoverflow com questions 4115372 jquery validate plugin adding a custom validator to accept l
  • 使用 Fancybox2 从多张预览图片启动一个画廊

    我正在启动一个包含多张预览图片 链接 的画廊 第一个开始图库 下一个进入同一图库中的特定照片 但如果您选择 可以单击整个图库 将其视为一个已设置的书签 可将您带到一个较大图像库的不同点 我现在已经复制了这对我来说是如何工作的 尽管它是多余的
  • 如果元素隐藏则忽略 .NET 验证器(显示:无)

    我们经常在使用 javascript css 隐藏的元素 即 display none 上使用 NET 验证器时遇到问题 例如 可能有语法错误 但不用担心
  • 在 Web 浏览器中查找触发 then 事件的 jQuery 代码

    我加入了一个团队来从事一个项目 现在他们使用 jQuery 并且很多 javascript 文件都是外部文件而不是嵌入的 当我点击一个按钮时 它看起来就像 a class button cancel Cancel a 它触发一个在一个 ja
  • 如果我拒绝确认,如何防止更改选择框值

    我正在使用国家 地区选择框 当用户选择一个国家 地区时 会出现添加分支链接 并且用户在该国家 地区下添加分支 但是当用户想要更改国家 地区时 则应销毁有关该国家 地区的所有分支 在更改国家 地区之前 会出现一个确认框并显示警告 一切正常 但
  • jQuery 中的 Javascript .files[0] 属性

    jQuery 中是否有与此语句等效的语句 var value document getElementById id files 0 使用附加 files 0 的标准 jQuery 选择器似乎不起作用 并且我找不到与 files 等效的 jQ
  • 如何动态添加和删除jquery选项卡?

    我有一个 aspx 页面 上面有 2 个静态 jquery 选项卡 单击其中一个选项卡上的按钮后 我想动态添加一个新选项卡 该选项卡从另一个 aspx 页面加载其内容 我也尝试使用以下示例 http jquery ui googlecode
  • 如何向 jQuery Tokeninput 添加占位符?

    如何将占位符添加到 jQuery Tokeninput 字段 一个正常的placeholder属性在这里不起作用 对于这样的输入
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • jQuery 验证规则和消息 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在设置 jQuery 验证的规则和
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一

随机推荐

  • 使用 Entity Framework 7 的 Fluent-API 创建可选外键

    我正在尝试使用 Entity Framework 7 和 Fluent API 创建可选外键 在 EF v6 x 中 我们可以选择使用以下命令添加此内容 WithOptional or HasOptional 但我在 EF 7 中找不到任何
  • 在 matlab 中保存设置

    确实是个愚蠢的问题 但是最近我整天都在做一些项目 我的眼睛很疼 如何在 Matlab 中保存设置 准确地说是颜色设置 以便在白天过去和夜晚到来时可以重新加载它们 将它们互换为不同的设置 一个子问题 matlab 我认为在本例中为 2008b
  • 有人可以给出pluginaweek - statemachine 的活动记录示例吗?

    有人可以举一个简单的例子来说明如何使用插件周状态机 https github com pluginaweek state machine对于具有活动记录的票证模型 我不明白文档中的复杂示例 示例说明 新 gt 接受 拒绝 反馈 已接受 gt
  • 在 Swift 中创建 gif 动画时出现问题

    我正在尝试从 4 个数组创建一个动画 gifUIImageSwift 中的元素 但目前它只保存第一帧 let url NSURL fileURLWithPath photosDirectory URLByAppendingPathCompo
  • Apache OFBiz delegator API 是否支持按限制或偏移量从数据库获取记录列表

    假设我们只需从表中获取 5 条记录 但我的 where 子句匹配数据库中的 25k 条记录 那么有没有办法ofbiz框架只选择 5 条记录 而不是从数据库获取列表 然后从列表中只取出 5 条记录 如果限制不可能 因为ofbizAPI 与数据
  • 修改函数内“按值传递”的参数并将它们用作局部变量

    我见过一些代码 其中按值传递给函数的参数被修改或分配了新值 并且像局部变量一样使用 这是一件好事吗 这样做有什么陷阱吗 或者这样编码可以吗 本质上 函数的参数是一个局部变量 所以这种做法原则上还不错 另一方面 这样做可能会导致维护麻烦 如果
  • 如何编写一个可以读取 doc/docx 文件并将其转换为 txt 的 python 脚本?

    基本上我有一个包含大量 doc docx 文件的文件夹 我需要 txt 格式的文件 该脚本应该迭代目录中的所有文件 将它们转换为 txt 文件并将它们存储在另一个文件夹中 我该怎么做 是否存在可以执行此操作的模块 我认为这将是一个有趣的快速
  • 将 JSON 转换为 PowerShell 对象并将 PowerShell 转换回 JSON

    我将 JSON 从 Azure 资源组导出到 JSON 文件 如下所示 Export AzureRmResourceGroup ResourceGroupName SourceResourceGroupName Path filename
  • cocoa WebView中innerhtml和outerhtml的区别

    我在我的应用程序中使用 cocoa webview 进行富文本编辑 只是与 webkit 中提供的innerHtml 和outerHtml 方法混淆了 谁能解释一下有什么区别 DOMHTMLElement webView mainFrame
  • 为什么优秀的 UI 设计对于一些开发人员来说如此困难? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 两个独立键盘的独立输入

    我有两个 USB 键盘插入同一台机器 我正在开发一个 Java 应用程序 是否有办法允许 Java 应用程序分离出它来自哪个 USB 键盘 即是否有类似的东西http docs oracle com javase 6 docs api ja
  • ajax提交表单为什么不能回显$_POST

    我正在使用ajax提交表单进行测试 提交给我自己的页面 new1 php 我想要的是 单击提交按钮后 它将回显名字和姓氏 但我不知道为什么提交后看不到名字和姓氏 这是new1 php页面
  • Zend Framework 2 - 如何包含库中的部分内容

    我写了一个部分 我想在几个模块中使用它 我认为最好的方法是将其放入我的自定义库中 但不幸的是 我无法找到一种方法来包含这个部分 而不使用像这样的非常难看的路径 echo this gt partial vendor myvendor lib
  • HTML5同页导航

    我在 html5 中遇到导航问题 我看了很多教程 我不知道我做错了什么 我想在同一页面上导航
  • Dropbox 是一个有效的快速但肮脏的源代码控制解决方案吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ADB 错误:无法连接到守护程序

    我需要帮助才能让 ADB 在我的 PC win7 64 位 和 Samsung Galaxy S2 上运行 我已经安装了 Kies 附带的驱动程序 我想是在子文件夹 25 escape 下 驱动程序在设备管理器下正确显示为 Samsung
  • Laravel - 如何注册自定义广播者

    我想使用 BroadcastManager 注册自定义广播器 而无需更改内部框架代码 现在我必须在Illuminate Broadcasting BroadcasterManager class protected function cre
  • R:如何使 dump.frames() 包含所有变量,以便稍后使用 debugger() 进行事后调试

    我有以下代码 它会引发错误并使用以下命令写入所有帧的转储dump frames as 提议 e G 通过哈德利 威克姆 http adv r had co nz Exceptions Debugging html a lt 1 b lt H
  • Ruby 比较运算符? == 与 === [重复]

    这个问题在这里已经有答案了 和 有什么区别 什么时候应该使用哪一个 两者都只是在对象上调用的方法 这意味着对象决定哪个意味着什么 然而 Ruby 中有一些关于它们之间差异的约定 通常 比 a b几乎总是为真 如果a b是 阅读此内容的最佳位
  • 如何在 MVC 4 中使用 jQuery 更新 List

    我目前正在尝试使用修改后的索引视图创建设置页面 目标是让用户获得所有设置显示并可以更改一个视图中的所有设置并保存所有设置只需一个按钮 应使用 Ajax 更新设置 我目前的做法 View