1

以下代码片段有效地表示了大型形式的项目。我的目标是重构它。

<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 助手。最终,如何将它们组合成更小更容易管理的部分。我通常要么使用相同的结构,要么使用输入、文本区域、下拉菜单,或者在某些情况下使用标签。有没有我没有想到的另一种更好的方法,或者我提到的方法有任何固有的缺点/优势/挑战?

4

1 回答 1

2

通过反射,您可以读取所有属性和 EditorFor 以创建元素:

反射 I
示例 反射 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>
}

在这里或这里可以看到如何使用编辑器模板来处理不同类型的属性或使用 UIHint。

编辑此评论:: “您如何以这种方式处理下拉列表?”

在这种情况下,我可以想到一个解决方案,但有点复杂。您可以在属性上放置一个属性,例如:

[ItPropertyHaveAList("PropertyWithListList")]
public int PropertyWithListId { get; set; }

public IEnumerable<SelectListItem> PropertyWithListList { get; set; }

EditorForProperty然后您可以检测该属性是否具有此属性的扩展,如下例所示

[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;

在此属性中,您将方法从列表数据中创建一个下拉列表。请参阅回复以了解如何为下拉列表创建模板。

于 2013-07-17T15:39:49.173 回答