【问题标题】:ASP.NET MVC Keep ModelState Valid on Failed Property BindingASP.NET MVC 在属性绑定失败时保持 ModelState 有效
【发布时间】:2014-09-05 17:25:54
【问题描述】:

我想知道 ASP.NET MVC 中是否有任何内置方法可以让模型属性包含在绑定中,但如果绑定失败,这不会使模型无效。假设我有以下支持 JqGrid CRUD 操作的简化模型:

public class JqGridCRUDDTO
{
    public JqGridCRUDOperation oper {get; set;}
    public int? id {get;set;}
}

当模型表示“添加”操作(由 oper 属性指定)时,JqGrid 将包含 HTML 元素的 id 属性发布为 id(我相信就是这样)。在这种情况下,id 属性的绑定会失败,这会使ModelState 无效。但是id 属性的绑定只会在我不需要它时失败(我只需要一个记录 id 来进行“编辑”和“删除”操作)。

我意识到,理想情况下,我应该为每个操作都有一个单独的模型,但是 JqGrid 似乎更自然地适合将所有 CRUD 操作发送到单个 URL,所以我不确定单独的模型方法会导致最简单的解决方案。修改我的客户端脚本也是如此,以便 JqGrid 在添加时发送一个整数值——我知道这是可能的,但它会增加客户端脚本的复杂性。我更愿意在服务器端管理尽可能多的复杂性。

如果没有内置的方法来做我所要求的,我想听听其他人会如何解决这个问题。

【问题讨论】:

    标签: c# ajax asp.net-mvc asp.net-mvc-4 jqgrid


    【解决方案1】:

    我不确定我是否完全理解您的问题。如果您不希望 jqGrid 在添加操作的情况下发送id="_empty",您可以修改serializeEditData 或onclickSubmit 内部的值。

    第一种方式(onclickSubmit):

    onclickSubmit: function (options, postdata) {
        if (postdata[this.id + "_id"] === "_empty") {
            return {id: null};
        }
    }
    

    替代方式(serializeEditData)在添加操作的情况下根本不保存任何id:

    serializeEditData: function (postdata) {
        var data = $.extend({}, postdata); // make copy of postdata object
        if (data.id === "_empty") {
            delete data.id;
        }
        return data;
    }
    

    【讨论】:

    • 是的,我看到其他问题和答案表明我在添加时应该得到“_empty”,但实际上我得到的是“jqg1”。
    • @grin0048:您可能使用inlineNav 使用内联编辑,或者您直接调用addRow 方法(或者可能您使用tse ``formatter: "actions")。在这种情况下,您可以将addRow 的rowID 参数指定为返回null 的函数,或者您可以使用serializeRowData 回调删除以“jqg”开头的id 值($.jgrid.uidPref)。无论如何,如果您遇到实施问题,您应该在问题文本中附加 Javascript 代码,该代码显示您如何使用行编辑和添加操作。
    • 我能够删除 serializeRowData 中的 Id 参数。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多