我有一个包含3个不同部分的表单,看起来像这样:
<form action="/Submit/" method="POST">
<h2>
Your Info:
</h2>
<ul>
<li>
<label>
First Name:
@Html.TextBoxFor(m => m.FirstName)
</label>
</li>
<li>
<label>
Last Name:
@Html.TextBoxFor(m => m.LastName)
</label>
</li>
</ul>
<h2>
Membership:
</h2>
<ul>
<li>
<label>@Html.RadioButtonFor(m => m.MembershipLength_Months, 3) 3 Months</label>
</li>
<li>
<label>@Html.RadioButtonFor(m => m.MembershipLength_Months, 12) 12 Months</label>
</li>
</ul>
<h2>
Billing Info:
</h2>
@Html.EditorFor(m=> m.PaymentInfo)
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
我想做的是每个部分都有一个摘要.我知道我可以在每个H2下做这样的事情:
@if (ViewData.ModelState.Keys.Contains("FirstName") || ViewData.ModelState.Keys.Contains("LastName"))
{
<div>
summary text
@Html.ValidationMessageFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
}
Run Code Online (Sandbox Code Playgroud)
但感觉应该有一个更清洁的解决方案.Google完全失败了,我无法找到自定义帮助程序或验证摘要扩展程序,它使用集合来表示要汇总的属性.
每个部分都包含大量字段,因此ModelState.Keys比较很快就会变得非常难看.有干净的方法吗?
我有一个遗留的VB.Net类库,其中包含一些扩展方法,其中一个大致如下:
Namespace Extensions
Public Module OrmExtensions
<Extension()>
Public Function ToDomainObjectCollection(ByRef objects As OrmCollection(Of OrmObject)) As DomainObjectCollection
Return objects.AsQueryable().ToDomainObjectCollection()
End Function
<Extension()>
Public Function ToDomainObjectCollection(ByRef objects As IQueryable(Of OrmObject)) As DomainObjectCollection
Dim doc As New DomainObjectCollection()
For Each o In objects
doc.Add(o.ToDomainObject())
Next
Return doc
End Function
End Module
End Namespace
Run Code Online (Sandbox Code Playgroud)
要在VB中使用这些扩展,我只需要导入Extensions.OrmExtensions.我有另一个项目,它在C#中依赖于具有扩展的VB,我无法让它们工作.OrmExtensions不可用,只使用命名空间VBProject.Extensions不会使扩展可用.
有多个项目依赖于VB项目,理想情况下,所有项目都可以使用扩展.
我已经完成了一些谷歌搜索,但还没有找到任何关于在C#中实际使用VB扩展方法的事情.我认为问题是他们需要在模块中,但我无法确认.
我宁愿不在任何需要的地方复制扩展方法(特别是在我们的单元测试项目中,这是在C#中).
我在一个代码库中工作,它有很多一流的集合.
为了便于在LINQ中使用这些集合,每个集合都有一个扩展方法,如下所示:
public static class CustomCollectionExtensions
{
public static CustomCollection ToCustomCollection(this IEnumerable<CustomItem> enumerable)
{
return new CustomCollection(enumerable);
}
}
Run Code Online (Sandbox Code Playgroud)
随附的构造函数:
public class CustomCollection : List<CustomItem>
{
public CustomCollection(IEnumerable<CustomItem> enumerable) : base(enumerable) { }
}
Run Code Online (Sandbox Code Playgroud)
这最终成了一堆样板,所以我试图写一个泛型,IEnumerable<U>.To<T>()这样我们就不必继续生成这些特定的ToXCollection()方法.
我得到了:
public static class GenericCollectionExtensions
{
public static T To<T, U>(this IEnumerable<U> enumerable) where T : ICollection<U>, new()
{
T collection = new T();
foreach (U u in enumerable)
{
collection.Add(u);
}
return collection;
}
}
Run Code Online (Sandbox Code Playgroud)
这必须被称为 customCollectionInstance.OrderBy(i => i.Property).To<CustomCollection, CustomItem>()
有没有办法避免必须指定CustomItem …