【问题标题】:Manually created input is breaking model posting back values手动创建的输入正在破坏模型回发值
【发布时间】:2014-10-15 12:38:26
【问题描述】:

我有以下 ViewModel:

public class DataSyncViewModel
{
    public ConfigurableDataSyncOptions DataSyncOptions { get; set; }
    public int Id { get; set; }
    public string SystemName { get; set; }
}

然后我循环遍历DataSyncOptions 以在我的视图中列出一些文本框:

@if (@Model.DataSyncOptions != null)
{
    if (Model.DataSyncOptions.TextConfigurableOptions != null)
    {
        for (int i = 0; i < Model.DataSyncOptions.TextConfigurableOptions.Count; i++)
        {
            <div class="span6">
                <h4>@Model.DataSyncOptions.TextConfigurableOptions[i].OptionText?</h4>
                <p>
                    @Html.EditorFor(m => Model.DataSyncOptions.TextConfigurableOptions[i].OptionValue)
                </p>
                @Html.HiddenFor(m => Model.DataSyncOptions.TextConfigurableOptions[i].OptionName)
            </div>
        }
    }
}
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.SystemName)

这很有效,当表单回传时,我可以从我的控制器访问SystemNameId

但是,如果我替换

@Html.EditorFor(m => Model.DataSyncOptions.TextConfigurableOptions[i].OptionValue)

@if (Model.DataSyncOptions.TextConfigurableOptions[i].OptionType == "")
{
    @Html.EditorFor(m => Model.DataSyncOptions.TextConfigurableOptions[i].OptionValue)

}
else
{
    //This appears to be causing issues
    <input type="@Model.DataSyncOptions.TextConfigurableOptions[i].OptionType" name="Model.DataSyncOptions.TextConfigurableOptions[@i].OptionValue" value="@Model.DataSyncOptions.TextConfigurableOptions[i].OptionValue" />
}

我的价值观不再随模型发回。我试图允许我的应用程序的插件创建者指定他们添加的选项的输入类型,因此我手动创建输入。

关于为什么更改输入生成会破坏回发时的模型绑定的任何想法?

【问题讨论】:

    标签: asp.net-mvc viewmodel model-binding


    【解决方案1】:

    而不是Modelname属性中写入模型类名称,即DataSyncViewModel要绑定:

    <input type="@Model.DataSyncOptions.TextConfigurableOptions[i].OptionType"
           name="DataSyncOptions.TextConfigurableOptions[@i].OptionValue"
           value="@Model.DataSyncOptions.TextConfigurableOptions[i].OptionValue" />
    

    实际上,当我们编写@Model 时,它实际上是我们的视图强类型化的类型实例,在这种情况下,模型是简单字符串而不是 Razor,因此它将保持为 Model 和由于名称与输入不同,因此它不会在帖子中绑定到模型属性。

    【讨论】:

    • 好吧,混蛋。现在我觉得很傻。谢谢你的时间。这让我感到困惑,因为它回发了输入的实际值,但破坏了其余部分。
    • 必须删除答案标记。使用您的代码更改我的输入内联会停止此输入回发的值。它之前正确回发,但停止了其他值。知道可能出了什么问题吗?
    • 如果action方法参数是(DataSyncViewModel model)那么name属性应该是DataSyncOptions.TextConfigurableOptions[@i].OptionValue(去掉DataSyncViewModel.前缀)
    • @StephenMuecke 很好,你是对的。 webnoob,你必须按照斯蒂芬所说的方式来表达
    猜你喜欢
    • 2023-01-23
    • 2017-01-13
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2013-09-06
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多