视图中的重构控制模式

时间:2013-07-17 15:07:11

标签: asp.net-mvc razor

以下代码段有效地表示大型表单中的项目。我的目标是重构它。

<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段。我通常要么使用输入,文本区域,下拉列表,或者在某些情况下使用标签来获得相同的结构。我还没有想到的另一种优越的方法,或者我提到过的任何固有的缺点/优势/挑战?

1 个答案:

答案 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>
}

herehere您可以看到如何将编辑器模板用于不同类型的属性或使用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响应,了解如何为下拉列表创建模板。