【问题标题】:Retrieve an array in viewmodel在视图模型中检索数组
【发布时间】:2012-11-26 11:29:15
【问题描述】:

我正在尝试创建一个页面来编辑我的附件。

附件模型:

public class Attachment
{
    ...
    private IList<JSONI18NText> titles = new List<JSONI18NText>();
    private IList<JSONI18NText> descriptions= new List<JSONI18NText>();
    ...
    public virtual IList<JSONI18NText> Titles
    {
        get { return titles; }
        set { this.titles = value; }
    }
    public virtual IList<JSONI18NText> Descriptions
    {
        get { return descriptions; }
        set { this.descriptions= value; }
    }

JSONI18NText 模型:

public class JSONI18NText
{
    public int LanguageId { get; set; }
    public string Text { get; set; }
}

附件视图模型:

public class AttachmentModel
{
    public AttachmentModel() { }

    public AttachmentModel(Attachment at) {
        ...
        this.Titles = new List<JSONI18NTextModel>();
        this.Descriptions = new List<JSONI18NTextModel>();

        foreach (JSONI18NText title in at.Titles)
        {
            this.Titles.Add(new JSONI18NTextModel(title, "Title"));
        }
        foreach (JSONI18NText description in at.Descriptions)
        {
            this.Descriptions.Add(new JSONI18NTextModel(description, "Description"));
        }
    }

    [Display(Name = "Title", Description = "Title of the file")]
    public IList<JSONI18NTextModel> Titles { get; set; }

    [Display(Name = "Description", Description = "Description of the attachment file")]
    [DataType(DataType.MultilineText)]
    public IList<JSONI18NTextModel> Descriptions { get; set; }

JSONI18NText 视图模型:

public class JSONI18NTextModel
{
    public JSONI18NTextModel() { }

    public JSONI18NTextModel(JSONI18NText jsonI18nText)
    {
        this.LanguageId = jsonI18nText.LanguageId;
        this.Text = jsonI18nText.Text;
    }

    [HiddenInput(DisplayValue = false)]
    public int LanguageId { get; set; }

    public string Text { get; set; }
}

现在,我想要实现的是一个带有选项卡式列表的语言编辑表单:例如,两个选项卡,一个用于英语,一个用于意大利语,如果您单击每个选项卡,您会读取标题的输入值以及该特定语言的描述。

一切都像一个魅力:我使用了一个带有两个部分视图的视图脚本,一个用于列表,另一个用于 JSONI18NTextModel:

编辑.cshtml:

...
@Html.EditorFor(model => model.Titles, "EditLabels")
@Html.EditorFor(model => model.Descriptions, "EditLabels")
...

EditLabels.cshtml:

@model List<CR2.Web.Areas.Admin.Models.JSONI18NTextModel>
@using CR2.Web.Infrastructure
@using CR2.Web.Areas.Admin.Models

@if(Model.Count() == 1)
{
    @Html.EditorFor(model => model[0], "EditLabel");
}
else
{
    for(int i = 0; i < Model.Count(); ++i)
    {
        <div>
            <ul>
            @Html.EditorFor(model => model[i], "EditLabel")
            </ul>
        </div>
    }
}

EditLabel.cshtml:

@model CR2.Web.Areas.Admin.Models.JSONI18NTextModel
@using CR2.Web.Infrastructure

<li>
    @Html.HiddenFor(model => model.LanguageId)
    <div>
        @Html.LabelWithTooltip(model => model.Text)
    </div>
    <div>
        @Html.EditorFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>
</li>

当我渲染它时,它会构建名称为“Titles.[0].Text”的字段,我认为这很完美......

当我提交表单时出现问题:AttachmentModel 中没有填充“Titles”和“Descriptions”...(填充了其他所有内容)

有什么想法吗?我做错了什么?

非常感谢!!!

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    遍历列表并填充每个值应该类似于:

    @foreach (JSONI18NTextModel item in model) 
    {
        Html.EditorFor(i => item.Titles, "EditLabels");
        Html.EditorFor(i => item.Descriptions, "EditLabels");
    }
    

    那么我假设您只将一个模型发布到控制器操作:

    [HttpPost]
    public ActionResult Edit(JSONI18NTextModel model)
    {
        // The only Model you are posting should be accessible here.
    }
    

    如果您的页面上有一个模型列表,那么您可能希望创建一个Details 视图,在该视图中您一次只能访问一个模型,并且只将该模型发布到控制器。

    【讨论】:

    • 感谢提示,但渲染结果ok,提交表单后我无法检索模型...
    • 我使用 HttpPost 控制器操作进行了编辑,一旦发布表单,模型应该可以访问。请注意,如果您正在使用列表并且在表单中包含整个列表,那么您最好创建一个详细信息视图。
    • 我的 Edit 方法接收一个 AttachmentModel 参数...我的意愿是在该 AttachmentModel 中也有 JSON...模型,例如已对类进行编码...
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2016-01-24
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2016-10-24
    相关资源
    最近更新 更多