【问题标题】:MVC handling Collection Item Index in Partial view modelMVC 处理部分视图模型中的集合项索引
【发布时间】:2014-02-05 18:57:38
【问题描述】:

我有一个 ViewModel,里面有一个集合,例如:

public class CreateCampaignViewModel : ControlPanelViewModel
{
    [RequiredField]
    public string Name { get; set; }

    public List<AdvertisementViewModel> Advertisements { get; set; }
    ...
}

在视图中,如果我像这样使用它:

@for (int i = 0; i < Model.Advertisements.Count; i++)
{
  <fieldset style="z-index: 0;">
  <legend>מודעה</legend>
  <table style="width: 100%;">
    <tr>
      <td>
        <label for="@Html.NameFor(m => m.Advertisements[i].Title)">כותרת הפרסומת</label></td>
      <td>@Html.TextBoxFor(m => m.Advertisements[i].Title)</td>
    </tr>
  </table>
  </fieldset>
}

一切都很好,当我发布表格时我可以看到列表......

但我想将广告编辑器嵌套在部分视图中,因此我的视图变为:

@for (int i = 0; i < Model.Advertisements.Count; i++)
{
   Html.RenderPartial("AdvertisementEditor", Model.Advertisements[i]);
}

和我的部分:

@model Pushed.Models.AdvertisementViewModel

<fieldset style="z-index: 0;">
    <legend>מודעה</legend>
    <table style="width: 100%;">
        <tr>
            <td>
                <label for="@Html.NameFor(m => m.Title)">כותרת הפרסומת</label></td>
                <td>@Html.TextBoxFor(m => m.Title)</td>
        </tr>
    </table>
</fieldset>

我的问题是,现在,当我发布表单时,我没有得到每个广告的 TextBox 中的值。

这是合乎逻辑的,因为现在我的 &lt;input&gt; 标签没有“advertisement[1].Title”名称,而只有在我的包含模型中不存在的“Title”。

我怎样才能创建一个反映单个集合项目的部分内容,以便它可以正确地与表单一起重新发布?

【问题讨论】:

    标签: asp.net-mvc collections indexing asp.net-mvc-partialview asp.net-mvc-viewmodel


    【解决方案1】:

    找到了解决方案,不敢相信我以前没有找到这个!

    有两种方法可以告诉 MVC.NET 为输入字段添加前缀:

    1. 创建 EditorTemplate 而不是 PartialView...,它会很好用。

    2. 定义TemplateInfo.HtmlFieldPrefix

    如图所示调用局部视图:

    @{ 
      Html.RenderPartial("TargetAudienceParameters", Model.TargetAudienceParameter, 
          new ViewDataDictionary {
               TemplateInfo = new TemplateInfo {
                   HtmlFieldPrefix = "Advertisements[4]" // 4 being an example
               } 
          }); 
     }
    

    【讨论】:

    【解决方案2】:

    在我的项目中,当我遇到此问题时,我开始使用 ajax 查询,该查询在用户离开文本框之后命中。这不是最清晰的解决方案,但对我有用。您还需要在部分视图中为每个组元素生成特殊 ID。关于:

    function eduFacilityTableSave() {
        $('#eduFacilityTable tr input[type="text"],#eduFacilityTable tr select').change(function () {
            var parId = $(this).parent().parent().attr('id');
            var parentName = parId.replace(/\d+/g, '');
            var parentId = parId.replace(/\D+/g, '');
            var id = $(this).attr('id');
            var text = $(this).val();
            //alert(text);
            $.ajax({
                type: "POST",
                //contentType: "application/json; charset=utf-8",
                url: "/Form/SaveFromForm/",
                data: { id: id, parentId: parentId, parentName: parentName, text: text },
                dataType: "json",
                success: function (data) {
                    //
                }
            });
        });
    }
    
    public JsonResult SaveFromForm(string id, string parentId, string parentName, string text) {
                if (parentName == "eduFacility") {
                    var edufacility = _repository.GetEduFacilityById(Convert.ToInt32(parentId));
                    if (id == "EntryYearId") {
                        edufacility.EntryYearId = Convert.ToInt32(text);
                    }
                    if (id == "FinishYearId") {
                        edufacility.FinishYearId = Convert.ToInt32(text);
                    }
                    if (id == "FullName") {
                        edufacility.FullName = text;
                    }
                    if (id == "Speciality") {
                        edufacility.Speciality = text;
                    }
                    if (ModelState.IsValid) {
                        _repository.UpdateEduFacility(edufacility);
                        _repository.Save();
                    }
                }
                return Json("Success", JsonRequestBehavior.AllowGet);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多