使用HtmlHelper作为内部模型属性

时间:2015-03-17 15:04:15

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

我有一个我的Asp.net MVC视图的模型结构:

public class MyModel{
   public AnotherModel1 Prop1 {get;set;}
   public AnotherModel2 Prop2 {get;set;}
}
public class AnotherModel1{
   public InnerModel InnerProp1 {get;set;}
   public InnerModel InnerProp2 {get;set;}
   public InnerModel InnerProp3 {get;set;}
}
public class AnotherModel2{
   public InnerModel InnerProp1 {get;set;}
   public InnerModel InnerProp2 {get;set;}
}
public class InnerModel {
   public string Input {get;set;}
}

这意味着,MyModel是传递给View的通用模型。其他一些模型是AnotherModel1,AnotherModel2,其中包含InnerModel作为属性。

我想创建一个知道如何渲染InnerModel的辅助函数。 然后在我的页面视图中,我希望能够编写类似的内容 @RenderInnerModel(m => m.Prop1.InnerProp1)

问题是,我不知道如何将htmlhelper传递给我的函数,以便能够在我的帮助器中使用@ Html.TextBoxFor(m => m.Input)。

虽然问题可以通过使用每个InnerModel的部分视图来解决,但我希望有参数化辅助函数,并且不想弄乱部分复杂模型,例如使用元组等。


修改

虽然EditorFor似乎几乎是我想要的,但我仍然想要理解是否有可能有像

这样的东西
var modelHelper = new HtmlHelper<InnerModel>(ViewContext, this);

但是在MyModel的背景下?谢谢!

1 个答案:

答案 0 :(得分:2)

你的控制器:

  public class AnotherModel
  {
     public InnerModel InnerProp1 { get; set; }
     public InnerModel InnerProp2 { get; set; }
  }
  public class InnerModel
  {
     public string Input { get; set; }
  }

  public class EditorExampleController : Controller
  {
     //
     // GET: /EditorExample/

     public ActionResult Index()
     {
        AnotherModel model = new AnotherModel();
        model.InnerProp1 = new InnerModel { Input = "test 1" };
        model.InnerProp2 = new InnerModel { Input = "test 2" };
        return View(model);
     }
  }

你的观点:

  @model MVCApp.Controllers.AnotherModel
  <h2>Editor template</h2>
  @Html.EditorFor(_ => _.InnerProp1)
  @Html.EditorFor(_ => _.InnerProp2)

on&#34; shared&#34;文件夹在&#34;视图&#34;创建一个新的文件夹调用&#34; EditorTemplates&#34;,然后添加一个局部视图&#34; InnerModel.cshtml&#34; :

  @model MVCApp.Controllers.InnerModel

  @if (Model.Input == "test 2")
  {
     <h4>@Model.Input</h4>
  }
  else
  {
     <h2>@Model.Input</h2>
  }

这是一个简单的实现,如果你想我可以发布自定义HtmlHelper