ASP.NET MVC:jQuery UI可选表单发布和验证

时间:2011-11-11 15:03:34

标签: jquery asp.net-mvc jquery-ui jquery-validate selectable

我有一个项目列表,我向用户显示,并允许他们通过使用jQuery UI Selectable交互选择其中一个或多个。为了将所选值发布回Controller,我在每个可选项目中包含一个隐藏的输入字段,我在所选事件上通过javascript设置。以下是我如何设置

的示例

模型

public class ItemsViewModel
{
     public List<Item> Items { get; set; }
}

public class Item 
{
     public int Id { get; set; }
     public string Name { get; set; }
     public bool Selected { get; set; }
}

HTML

<ul id="Items">
     <li>
          <label>Item 1</label>
          <input type="hidden" id="Items[0]_Id" name="Id" value="1" />
          <input type="hidden" id="Items[0]_Selected" name="Items[0].Selected" class="is-selected" value="False" />
     </li>
     <li>
          <label>Item 2</label>
          <input type="hidden" id="Items[1]_Id" name="Items[1].Id" value="2" />
          <input type="hidden" id="Items[1]_Selected" name="Items[1].Selected" class="is-selected" value="False" />
     </li>
</ul>

JavaScript

 $('#Items').selectable({
        filter: 'li',
        selected: function (event, ui) {
            $(ui.selected).find('input.is-selected').val('True');
        },
        unselected: function (event, ui) {
            $(ui.unselected).find('input.is-selected').val('False');
        }
    });

我的第一个问题,虽然这有效,但它并不是最漂亮的解决方案。有没有人有更好的方法来发布可选择的项目?

其次,我需要确保用户从列表中选择了至少一个项目。是否可以挂钩jQuery客户端验证以确保用户至少选择了一个项目?我对如何实现这一点有一些想法,我没有创建自定义验证属性的问题,但我想我会问我是否已经完成或者在我把它放在一起之前做的最佳方法。

由于

1 个答案:

答案 0 :(得分:1)

Youu尚未显示您用于发布项目的代码。对我来说,这似乎是有趣的。

至于依靠隐藏的领域,我不知道你为什么这样做。为什么不在选定的事件中填充一系列项目,然后在执行AJAX POST时发送该数组?

itemsToPost = [];

$('#Items').selectable({ 
    filter: 'li', 
    selected: function (event, ui) {
        itemsToPost.push( {id: ui.attr('id'), name:ui.text()}); 
    }, 
    ...

$.ajax({url     : "/whatever/ASPNETMVC/Endpoint",
        cache   : false,
        type    : "POST", // http method
        dataType: "json",
        data    : itemsToPost,
        error   : function(xhr,status,error){
                ...
        },
        success : function(msg, arg2, xhr){
                ...
        });