使用list属性的自定义编辑器模板

时间:2014-08-01 02:48:14

标签: c# asp.net-mvc asp.net-mvc-4 razor

我几乎已经开始工作了,但我缺少一点微小的知识来完成这项工作,这是一个我知道的快速解决方案。

我将两个ViewModel放入一个视图中:

public class MajorViewModel
{
    public ICollection<Major> Majors { get; set; }
}
public class MinorViewModel
{
    public ICollection<Minor> Minors { get; set; }
}

进入这样的视图:

<snip>
@Html.Partial("_MajorPartial")
@Html.Partial("_MinorPartial")
<snip>

谁的观点如下:

// _MajorPartial
@using Microsoft.AspNet.Identity
@model ClassPlannerMVC.ViewModels.MajorViewModel

@using (Html.BeginForm())
{
     //@Html.EditorFor(m => m.Majors) ?? I'm not able to use this here
}

// _MinorPartial
looks the same except "Major" is changed to "Minor"

然后我在Views / Shared / EditorTemplates / Major.cshtml和Minor.cshtml中有两个视图

// Major.csthml
@model ClassPlannerMVC.Models.Major

@Html.HiddenFor(m => m.ID)

<div class="form-group">
    @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.EditorFor(m => m.Name, new { @class = "form-control" })
    </div>
</div>

// Minor.cshtml
looks the same except "Major" is changed to "Minor"

我的两个模特是:

public class Major
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<UserHasMajor> UserHasMajors { get; set; }
}

public class Minor
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<UserHasMinor> UserHasMinors { get; set; }
}

目前视图没有显示我的视图模型(MajorViewModel,MinorViewModel),它们将分别显示Major和Minor的编辑器。我知道我可能会将错误传递给_MajorPartial和_MinorPartial视图,这就是为什么我不能添加一个@ Html.EditorFor(x =&gt; x.Majors)来显示我的自定义编辑器模板。我的代码中有一些非常小的遗漏,您是否发现了我遇到的错误?

如果有必要,我会上传更多代码。

1 个答案:

答案 0 :(得分:1)

您似乎没有将任何内容传递给您的@Partial()方法(即模型为空)。我建议你创建另一个视图模型来保存它们并传递主视图,比如

public class CombinedViewModel
{
  public MajorViewModel MajorVM { get; set; }
  public MinorViewModel MinorVM { get; set; }
}

在[HttpGet]方法中,填充视图模型并传递到主视图

public ActionResult Details()
{
  CombinedViewModel model = new CombinedViewModel();
  // set properties
  model.MajorVM = new MajorVM();
  model.MajorVM.Majors = // assign your collection
  ..
  return View(model);
}

然后在主视图中

@model YourAssembly.CombinedViewModel
...
@Html.Partial("_MajorPartial", Model.MajorVM)
@Html.Partial("_MinorPartial", Model.MinorVM)

或者,只有一个具有属性public ICollection<Major> Majors { get; set; }public ICollection<Minor> Minors { get; set; }的视图模型(不确定您是否为了简洁省略了其他一些属性,因此您需要具有单独的视图模型)