如何使用数据注释中的远程属性验证 Telerik mvc 网格?

Posted

技术标签:

【中文标题】如何使用数据注释中的远程属性验证 Telerik mvc 网格?【英文标题】:how to validate telerik mvc grid using remote attribute in data annotations? 【发布时间】:2013-08-16 01:22:11 【问题描述】:

我想使用 Telerik mvc 网格(批量编辑)检查用户名是否已存在于数据库中。但问题是为了验证它,我需要将 applconst_id 作为参数传递给 CheckDuplicateType 函数。但它总是返回“未定义”,我不知道如何获得正确的值。

这是我的模型类:

public class masterTypeCont

    [Key]
    public Int32 applconst_id  get; set; 

    [Required(ErrorMessage = "This field needs a value!")]
    [Remote("CheckDuplicateType",
        "Type",
        AdditionalFields = "applconst_id",
        ErrorMessage = "Code already exists.")]
    public String note1  get; set; 

这是我的控制器:

[HttpGet]
    public virtual JsonResult CheckDuplicateType(masterTypeCont tipe, String applconst_id)
    
        Int32 intID = Convert.ToInt32(applconst_id);
        return Json(typeEnt.ValidateCustomer(intID, tipe.note1), JsonRequestBehavior.AllowGet);
    

这是 ValidateCustomer 函数:

public bool ValidateCustomer(Int32 id, String nama) 
        Int32 x = db.appl_const.Where(a =>
           a.group_id == "CH_COMP_CODE" &&
           a.note1.Trim() == nama.Trim() &&
           a.applconst_id != id).Count();

        Boolean res = x == 0 ? true : false;

        return res;
    

这是我的看法:

    @
    ViewBag.Title = "Type List";
    Layout = "../Shared/_Layout.cshtml";


<div class="direct-content">
@using (Html.BeginForm())
    
    @(Html.Telerik().Grid<ComplaintHandling.Models.masterTypeCont>()
        .Name("TypeGrid")
        .Localizable("id-ID")
        .ToolBar(commands =>
        
            commands.Insert();
            commands.SubmitChanges();
        )
        .DataKeys(keys => keys
            .Add(o => o.applconst_id)
                .RouteKey("applconst_id"))
        .DataBinding(dataBinding =>
        
            dataBinding.Ajax()
                .Select("_SelectAllType", "Type")
                .Update("_SaveBatchType", "Type");
        )
        .Columns(columns =>
        
            columns.Bound(o => o.applconst_id).Hidden();
            columns.Bound(o => o.note1).Title("Name");
            columns.Command(commands =>
            
                commands.Delete().ButtonType(GridButtonType.Text);
            ).Title("Command");
        )
        .ClientEvents(events => events
                .OnEdit("OnEditGrid")
        )
    .Editable(editing => editing.Mode(GridEditMode.InCell))
    .Selectable()
    .Pageable(pager => pager.PageSize(15))
    .Filterable()
    .Sortable()
    .Scrollable(x => x.Height("450px"))
    .KeyboardNavigation()
    .Resizable(x => x.Columns(true))
    )

    <input type="hidden" name="applconst_id" id="applconst_id" value="1">

</div> 

我在那里写了隐藏输入以包含 applconst_id,但它的值仍然没有传递给控制器​​。

对不起,我的英语不好。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

试试这样:

[HttpGet]
public virtual ActionResult CheckDuplicateType(masterTypeCont tipe)

    var result = typeEnt.ValidateCustomer(tipe.applconst_id, tipe.note1);
    return Json(result, JsonRequestBehavior.AllowGet);

【讨论】:

我已经尝试过了,但是tipe.applconst_id 始终为0。还有其他解决方案吗?谢谢。【参考方案2】:

感谢之前的回答。

经过一番研究,我终于找到了解决自己问题的方法。 我在那里创造了一个小技巧,也许这不是一个好方法,但至少它可以解决我的问题。 基本上,我只是使用元素的 name 属性,以便将其值传递给控制器​​。

在这里,我将详细解释我是如何做到这一点的。

首先,我将视图中的 Grid 列更改为如下所示: 请注意 applconst_id 隐藏字段。我在那里添加客户端模板。

columns.Bound(o => o.applconst_id).Hidden()
            .ClientTemplate("<input class='typeID' name='common_id' value='<#= applconst_id #>'>");
        columns.Bound(o => o.note1).Title("Nature of complaint");

其次,我在“onEdit”函数中添加了这段代码:

//this code change ID that is being edited, so that it can be passed to controller
    var $inputID = $('.t-grid-edit-cell').prev().find('.typeID');
    $inputID.attr('name', 'applconst_id');

    //change back ID that is not being edited, so that it's not passed to controller
    $('td:not(.t-grid-edit-cell)').prev().find('.typeID').attr('name','common_id');

第三,这是我的控制器:

[HttpGet]
    public JsonResult CheckDuplicateType(String applconst_id, String note1)
    
        Int32 IntID = Convert.ToInt32(applconst_id);
        return Json(typeEnt.ValidateCustomer(IntID, note1), JsonRequestBehavior.AllowGet);
    

我的“ValidateCustomer”功能保持不变。

我希望我的解决方案可以帮助与我有同样问题的其他人。

谢谢。

问候, L.W.

【讨论】:

以上是关于如何使用数据注释中的远程属性验证 Telerik mvc 网格?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数据注释为模型属性 WebApi .NET Core 添加布尔验证

验证 RadDatePicker (Telerik Controls) 的日历控制

使用数据注释部分验证模型属性

ASP.NET MVC、Telerik Kendo、jQuery 验证中的非标准日期格式

如何在 Spring 中使用从属性文件获取的错误消息的注释验证?

使用数据注释的依赖属性的自定义模型验证