【问题标题】:How to call TryUpdateModel outside a data operation method如何在数据操作方法之外调用 TryUpdateModel
【发布时间】:2014-02-10 12:04:04
【问题描述】:
  • VS2012,.NET 4.51

我有一个用户控件,其中包含一个使用模型绑定的ListView。到目前为止,一切都很好。我想根据用户如何操作视图模式来显示对象列表。为此,我有一个名为 Roles 的公共财产。但是,当我从那里调用 TryUpdateModel() 时,我收到了异常:

TryUpdateModel' 必须传递一个值提供者,或者必须 从使用的控件的数据操作方法内部调用 数据绑定的模型绑定

现在我知道我可以通过以下方式退出编辑模式:

lvData.EditIndex = -1;

然后在UpdateMethod 调用TryUpdateModel() 中,我想知道如何调用TryUpdateModel 而无需连接方法来进行更新。换句话说,我如何/在哪里/为IValueProvider 参数提供什么给TryUpdateModel()

/// <summary>
///     Initialise the user control
/// </summary>
/// <param name="aRoles">List of roles to display</param>
public void Activate(List<RoleInfo> aRoles)
{
    //List we will be binding
    _ViewModel = new List<MembershipRolesViewModel>();

    //Transfer the supplied list into the view model
    foreach (RoleInfo roleInfo in aRoles)
    {
        _ViewModel.Add(new MembershipRolesViewModel
        {
            RoleDisplayName = roleInfo.RoleDisplayName,
            RoleHint = roleInfo.RoleHint,
            RoleName = roleInfo.RoleName,
            RoleSelected = roleInfo.RoleSelected
        });
    }
}

//ListView.SelectMethod points here
public IQueryable<MembershipRolesViewModel> RolesSelect()
{
    return _ViewModel.AsQueryable();
}

//Property to return the roles as manipulated by the user
public List<RoleInfo> Roles
{
    get
    {
        List<RoleInfo> result = new List<RoleInfo>();
        TryUpdateModel(_ViewModel);

        foreach (MembershipRolesViewModel membershipRolesViewModel in _ViewModel)
        {
            result.Add(new RoleInfo
            {
                RoleDisplayName = membershipRolesViewModel.RoleDisplayName,
                RoleHint = membershipRolesViewModel.RoleHint,
                RoleName = membershipRolesViewModel.RoleName,
                RoleSelected = membershipRolesViewModel.RoleSelected
            });
        }

        return result;
    }
}

TryUpdateModel 必须传递一个值提供程序,或者必须从使用模型绑定进行数据绑定的控件的数据操作方法内部调用。

【问题讨论】:

  • 我尝试了TryUpdateModel(_viewModel, new FormValueProvider(Page.ModelBindingExecutionContext));,但没有成功。它运行,FormValueProvider 正确解析表单值....但TryUpdateModel 不会将它们复制到相应的 viewModel 属性。
  • 我可以看到您只是在填充 ViewModel 以与视图一起使用。没有提到操作方法或 cshtml 参考。你到底想用 TryUpdateModel() 实现什么,因为这只是对 ModelBinder 的显式调用。而且这里没有 IValueProvider 。如果您正在寻找有关更新模型的更多信息,请参阅此:stackoverflow.com/questions/5268421/…
  • 是否有可能提供一些工作 WebForms 代码的示例?
  • 需要更多代码才能了解问题上下文中发生的情况。你能粘贴整个班级吗?
  • 我什至无法弄清楚TryUpdateModel 是什么,因为你没有显示你在哪个班级。sscce.org

标签: c# asp.net webforms model-binding


【解决方案1】:

没有简单的方法可以从 ListView 项中获取值。您必须对项目进行循环并提取它们的值。

var bindableTemplate = lv.ItemTemplate as IBindableTemplate;
foreach (ListViewItem item in lv.Items)
{
    var dic = bindableTemplate.ExtractValues(item).Cast<System.Collections.DictionaryEntry>().ToDictionary(k => (string)k.Key, v => v.Value);
    var provider = new DictionaryValueProvider<object>(dic, System.Globalization.CultureInfo.InvariantCulture);

    // Now we can update the item.
    TryUpdateModel<RoleInfo>(model, provider);
}

或者强制 ListView 更新自己的项目。

public List<RoleInfo> Roles
{
    get
    {
        List<RoleInfo> result = new List<RoleInfo>();
        for (int i = 0; i < lv.Items.Count; i++)
            if (lv.Items[i].ItemType == ListViewItemType.DataItem)
                lv.UpdateItem(i, true);

        //...

        return result;
    }
}



public void lv_UpdateItem(int id)
{
    RoleInfo model = //...
    TryUpdateModel(model);
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在 Action 方法之外调用 TryUpdateModel 是错误的做法。 因为 Model Binder 与 Action 方法紧密耦合,因此它们可以使用我们在 UI 上填充的数据自动填充模型属性。

    所以,请尝试在操作方法中尝试 TryUpdateModel,我希望它会正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-20
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多