以下代码段有效地表示大型表单中的项目。我的目标是重构它。
<div class="span3">
<ul style="list-style-type: none">
<li><b>Description</b></li>
<li>
<textarea style="width: 100%;" rows="4">@Model.Item.Description</textarea>
</li>
</ul>
</div>
<div class="span3">
<ul style="list-style-type: none">
<li><b>Truck</b></li>
<li>
@Html.DropDownListFor(model => model.Item.ShippingTruckId, new SelectList(Model.ShippingTrucks, "Id", "Truck"))
</li>
</ul>
</div>
<div class="span3">
<ul style="list-style-type: none">
<li><b>Cost</b></li>
<li>
<input value="@Model.Item.Cost"/>
</li>
</ul>
</div>
我考虑过的两种方法是局部视图和HTML帮助器。但最终,如何将那些成为一个更小的更容易的maange段。我通常要么使用输入,文本区域,下拉列表,或者在某些情况下使用标签来获得相同的结构。我还没有想到的另一种优越的方法,或者我提到过的任何固有的缺点/优势/挑战?
答案 0 :(得分:2)
使用反射,您可以阅读所有属性和EditorFor来创建元素:
Example for Reflection I
Example for reflection II
第一个例子:
@foreach (var property in Model.EnumerateProperties())
{
<div class="span3">
<ul style="list-style-type: none">
<li><b>@Html.LabelForProperty(Model,property);</b></li>
<li>
@Html.EditorForProperty(Model,property);
</li>
</ul>
</div>
}
here或here您可以看到如何将编辑器模板用于不同类型的属性或使用UIHint。
修改此评论:“您如何以这种方式处理下拉列表?”
在这种情况下,我可以想到一个解决方案,但有点复杂。你可以在属性上放置一个属性,如:
[ItPropertyHaveAList("PropertyWithListList")]
public int PropertyWithListId { get; set; }
public IEnumerable<SelectListItem> PropertyWithListList { get; set; }
然后您可以检测扩展程序EditorForProperty
是否具有此属性like this example:
[StringLength(20, MinimumLength = 5, ErrorMessage = "First name must be between 5 and 20 characters")]
public string FirstName {get;set;}
StringLengthAttribute strLenAttr =
typeof(Person).GetProperty("FirstName").GetCustomAttributes(
typeof(StringLengthAttribute), false).Cast<StringLengthAttribute>().Single();
int maxLen = strLenAttr.MaximumLength;
在此属性中,您可以从列表数据中放置方法以创建下拉列表。请参阅this响应,了解如何为下拉列表创建模板。