我已经为此花了几个小时,这令人沮丧:
我的 ViewModel 属性之一是分配列表。对于每个分配,我都会显示一个 jQueryUI 滑块。滑动时,DisplayFor 元素更新为新值(包含滑块的新值)。
这是代码:
js:
var slider = someDiv.find(".sliderInitial");
slider.each(function () {
$(this).slider(
{
min: 0,
max: 10,
value: $(this).parent().find(".pointsForSliderInitial").text(),
orientation: "vertical",
slide: function (event, ui)
{
var thisDiv = $(this).parent().find('.pointsForSliderInitial');
thisDiv.text(ui.value);
thisDiv.find('#pointsForSliderInitial').val(ui.value); //this line does nothing
calculatePointsSumInitial();
}
}
);
部分视图(使用 ViewModel):
@for (int i = 0; i < Model.Allocations.Count(); i++)
{
<td>
<div class="hidCategoryDescriptionInitial">
@Html.(alloc => alloc.Allocations[i].CategoryName)
- @Html.DisplayFor(alloc => alloc.Allocations[i].CategoryDescription)
</div>
<div class="pointsForSliderInitial round label">
@Html.HiddenFor(alloc => alloc.Allocations[i].AllocationID, new { id = "pointsForSliderInitial" + i }) //this hidden isn't working as expected
@Html.DisplayFor(alloc => alloc.Allocations[i].Points)
</div>
<div class="sliderInitial" />
</td>
}
这是一个局部视图,包含在 Html.BeginForm() 中。表单通过输入类型提交提交。
这行得通。但现在我还需要将新滑动的值提交到数据库。这是困难所在 - 如何将 Html.DisplayFor() 包含的值从我的 pointsForsliderInitial 提交到数据库?
我需要提交一个提交,其中我的分配属性填充了从 HiddenFor() 中获取的值,这些值应该包含我通过使用滑块更新的值。
每次我提交时,模型分配属性都为空。
我在这里做错了什么?如果信息不完整,请告诉我。
编辑:
Allocations 属性的 Viewmodel 定义是一个 AllocationsViewModel 类型的列表(这是一个将数据库中多个表中的数据放在一起的视图模型:
public List<AllocationsViewModel> Allocations { get; set; }
div“pointsForSliderInitial”的输出 html:
<div class="pointsForSliderInitial round label">
<input data-val="true" data-val-number="The field AllocationID must be a number."
data-val-required="The AllocationID field is required."
id="pointsForSliderInitial0"
name="Allocations[0].AllocationID"
type="hidden" value="75" />
0
</div>
编辑 2
在有用的评论和回答之后,我取得了一些进展。首先,我更新了滑块创建和幻灯片事件:
$(this).slider(
{
animate:true,
min: 0,
max: 10,
value: $(this).parent().find("input.valueHolder").val(),
orientation: "vertical",
slide: function (event, ui)
{
var thisDiv = $(this).parent().find('.pointsForSliderInitial');
var newValue = ui.value;
thisDiv.text(newValue);
thisDiv.find('.valueHolder').val(newValue);
}
其次,我通过将属性 [HiddenInput] 添加到 AllocationID 和 Points 属性来更新 AllocationsViewModel:
public class AllocationsViewModel
{
[HiddenInput]
public int AllocationID { get; set; }
[HiddenInput]
public int Points { get; set; }
public DateTime LastUpdated { get; set; }
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string CategoryDescription { get; set; }
}
最后,我更新了视图:
<div class="pointsForSliderInitial round label">
@Html.HiddenFor(alloc => alloc.Allocations[i].AllocationID)
@Html.HiddenFor(alloc => alloc.Allocations[i].Points,new {@class="valueHolder"})
</div>
完成所有这些操作后,当使用按钮提交表单时,控制器会正确地将对象传递给操作(按应有的方式填充分配列表)。但是,只有当我不使用滑块时才会发生这种情况。如果我使用滑块(更新隐藏的输入),该操作再次接收分配为空。所以只要我不干扰滑块,它就可以工作。
不知何故,这条 jQuery 行打破了一些东西:
thisDiv.find('.valueHolder').val(newValue);
我想我将不得不更深入地挖掘,因为在 Firebug 中,当我调试时,在这条线执行之后,当我检查它的 val() 时,它给了我“未定义”。
编辑3:
我发现了chrome调试的问题!这真的很有趣:我在滑动时切换了滑块事件的顺序:
slide: function (event, ui)
{
var thisDiv = $(this).parent().find('.pointsForSliderInitial');
var newValue = ui.value;
thisDiv.find('.valueHolder').val(newValue);
thisDiv.text(newValue);
}
调用 val(newValue) 时,该值已正确设置。但接下来的一行,设置 .text(newValue) 正在破坏隐藏并混淆我的模型,使其返回 null 到操作。我刚刚删除了 thisDiv.text(newValue); -> 现在一切正常,我的模型接收到从滑块更新的正确点。