好的,所以我有一个强类型的客户"详细信息"视图,它采用Customer对象模型.
我正在使用LINQ to SQL,每个客户都可以拥有多个(停车)空间.
这是数据库中的FK关系,因此我的LINQ生成的Customer模型具有"Spaces"集合.大!
这是来自我的CustomerRepository的代码片段,我遍历客户的停车位以删除所有付款,空间,最后是客户:
public void Delete(Customer customer)
{
foreach (Space s in customer.Spaces)
db.Payments.DeleteAllOnSubmit(s.Payments);
db.Spaces.DeleteAllOnSubmit(customer.Spaces);
db.Customers.DeleteOnSubmit(customer);
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作!
现在在我的"详细信息"视图中,我想用客户的空间填充表格:
<% foreach (var s in Model.Spaces)
{ %>
<tr>
<td><%: s.ID %></td>
<td><%: s.InstallDate %></td>
<td><%: s.SpaceType %></td>
<td><%: s.Meter %></td>
</tr>
<% } %>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
foreach语句不能对'System.Data.Linq.EntitySet'类型的变量进行操作,因为'System.Data.Linq.EntitySet'不包含'GetEnumerator'的公共定义
最后,如果我将这段代码添加到我的Customer部分类中并使用视图中的foreach迭代ParkingSpaces,一切都按预期工作:
public IEnumerable<Space> ParkingSpaces
{
get
{
return Spaces.AsEnumerable();
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我不想重复自己.我也在想我可以使用ViewModel将Spaces集合传递给View,但是LINQ已经推断并在Customer模型上创建了Spaces属性,所以我认为只使用它是最干净的.
我错过了一些简单的事情,或者我是否正确地接近这个?
谢谢!
所以我有几乎1:1的视图比例来查看模型,事情似乎进展顺利.如果我正确理解他们的目的,那么看起来应该是视图模型
在努力遵守这些原则时,我的报告控制器有点像墙.为客户生成的各种报告需要访问大约30个左右的不同属性.因此,我的视图模型最终看起来与我的实体模型非常相似.
当然,最简单的解决方案是将实体模型传递给视图,这样我就可以访问所有属性,但是我还需要能够为空白或"不完整"的客户生成报告.这会导致问题在尝试访问我的Entity模型上的导航属性时将引用异常.
所以我可以对视图中的每个字段使用空检查,这看起来不太吸引人......或者我可以实现视图模型以避免空引用异常.问题是我最终得到了一个看起来像这样的视图模型:
var customer = customersRepository.GetCustomer(id);
var viewModel = new CustomersViewModel()
{
FirstName = customer.FirstName,
LastName = customer.LastName,
Address = customer.MailingAddress.Address,
City = customer.MailingAddress.City,
// and on and on for about 30 different properties
};
return View(viewModel);
Run Code Online (Sandbox Code Playgroud)
输入所有这些属性是其中一个感觉错误的事情.我错过了一个更优雅的解决方案吗?
在视图中的表中显示Customer的邮件地址时,请考虑以下代码:
<%: Customer.MailingAddress == null ? "" : Customer.MailingAddress.City %>
Run Code Online (Sandbox Code Playgroud)
我发现自己使用了相当数量的这些三元条件语句,我想知道是否有一种方法可以在条件中引用回被评估的对象,以便我可以在表达式中使用它.也许是这样的事情:
<%: Customer.MailingAddress == null ? "" : {0}.City %>
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?我知道我可以创建一个变量来保存值,但是将所有内容保存在视图页面中的一个紧凑的小语句中会很好.
谢谢!
我是一名HTML/CSS设计经验有限的开发人员.我一直试图创建这个简单的表格超过一个小时,所以我放弃并寻求帮助.

我尝试过这样的事情:
<ul>
<li><label>Name:</label><span class="line"> </span></li>
...
</ul>
li label {
display: inline-block;
}
li span {
display: inline-block;
width: 100%;
border-bottom: 1px solid #000;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何表达我希望跨度占据标签和包含div之间宽度的100%.
我希望渲染的HTML看起来与我的示例图像完全一样.也就是说,整个列表项不应加下划线,只应填写客户填写信息的空间.
请让我知道如何实现这一目标.谢谢!!!
这是两个样本:
这很好用:
void Main()
{
var list = Queryable.ProjectTo(typeof(Projection));
}
public static class QueryableExtensions
{
public static ProjectionList<T> ProjectTo<T>(this IQueryable<T> queryable, Type projectionType)
{
return new ProjectionList<T>(queryable, projectionType);
}
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
使用泛型方法'QueryableExtensions.ProjectTo(System.Linq.IQueryable)'需要2个类型参数
void Main()
{
var list = Queryable.ProjectTo<Projection>();
}
public static class QueryableExtensions
{
public static ProjectionList<T, P> ProjectTo<T, P>(this IQueryable<T> queryable)
{
return new ProjectionList<T, P>(queryable);
}
}
Run Code Online (Sandbox Code Playgroud)
当然第一个例子需要1个类型参数,但是编译器可以弄清楚它是什么,所以我不需要提供任何参数.第二个例子需要2个类型的参数,但是编译器知道T是什么,为什么它不仅要求不能推断的?
为了记录我在我的代码中使用第一个例子就好了,但我更喜欢第二个的语法更好,并且可能存在我希望具有投影的泛型类型的情况.有没有办法实现这一点,还是我咆哮错误的树?
谢谢!
我确信有一些我想念的简单,但我必须承认,此时我不知所措.
我以编程方式将TabItems添加到我的主TabControl,每个用户选择打开一个帐户.在创建和添加新的TabItem之前,我想检查用户是否已在另一个选项卡中打开该帐户.我不想最终打开两个相同的标签.
这是我最初编写的代码.希望它能让您了解我想要实现的目标.
if (tab_main.Items.Contains(accountNumber))
{
tab_main.SelectedIndex = tab_main.Items.IndexOf(accountNumber);
}
else
{
Search s = new Search(queryResults, searchText);
TabItem tab_search = new TabItem();
tab_search.Header = searchString;
tab_search.Name = accountNumber;
tab_search.Content = s;
tab_main.Items.Add(tab_search);
}
Run Code Online (Sandbox Code Playgroud)
当然这不能正常工作.在WinForms中,TabControl有一个带有ContainsKey方法的TabPages集合,我可以用它来搜索TabPage的名称.我没有得到Items.Contains()方法正在寻找的东西,因为它只指定一个对象作为参数,并且不引用该项目的名称!
非常感谢任何和所有的帮助.
谢谢!
所以我需要能够打印一个jQuery UI对话框.到目前为止,我的解决方案使我创建了一个"打印"按钮,创建一个<iframe>填充了对话框内容的新内容,然后打印出来.
我希望能够<iframe>在打印完成后立即将其删除.有什么方法可以做到这一点吗?我知道在IE中有一个onAfterPrint事件,但我需要它在所有浏览器中都能运行.
谢谢!
编辑:我欣赏其他建议,但我遇到了各种问题,试图使用CSS规则来打印jQuery对话框.在具有大量内容和多个对话框的页面上,叠加层和其他元素的结构将导致打印额外的空白页.我尝试过很多{visibility:hidden; }和{display:none; 但无法找到解决方案.
我需要能够在包装集中获得最顶层的".ui-dialog"元素.
我的第一个想法是做这样的事情:
var topDialog = $(".ui-dialog").orderBy("[style*=z-index]").eq(0);
Run Code Online (Sandbox Code Playgroud)
有没有比编写循环检查值更好的方法呢?
编辑:只是为了澄清......我需要能够在页面生命周期中的任何给定点获得最顶层的元素(打开和关闭多个对话框后).Nick Craver使用maxZ变量的答案似乎不起作用,因为删除对话框时变量不会减少.
这是我现在使用的循环,当我关闭一个看起来有点难看的对话框时:
// Enable printing of the top-most dialog or #page
if ($(".ui-dialog").length > 0) {
var top = $(".ui-dialog").first();
$(".ui-dialog").each(function () {
if ($(this).css("z-index") > top.css("z-index")) {
top = $(this);
}
});
top.removeClass("dont-print");
} else {
$("#page").removeClass("dont-print");
}
Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net-mvc ×2
jquery ×2
css ×1
entityset ×1
generics ×1
html ×1
javascript ×1
linq-to-sql ×1
tabcontrol ×1
tabitem ×1
viewmodel ×1
wpf ×1