如果我使用以下Controller方法:
public ActionResult Menu()
{
// do stuff...
return PartialView("viewName", navLinks);
}
Run Code Online (Sandbox Code Playgroud)
在_Layout.cshtml中调用局部视图,如下所示:
<div id="categories">
@{ Html.Action("Menu", "Nav"); }
</div>
Run Code Online (Sandbox Code Playgroud)
使用以下ASCX局部视图:
<%@ Control Language="C#"
Inherits="ViewUserController<IEnumerable<MyDataType>>" %>
<% foreach(var link in Model) { %>
<%: Html.Route.Link(link.Text, link.RouteValues) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
一切正常.好极了.
但是,如果我使用以下任一RAZOR部分视图:
@model IEnumerable<MyDataType>
@foreach(var link in Model){
Html.RouteLink(link.Text, link.RouteValues);
}
Run Code Online (Sandbox Code Playgroud)
要么...
@model IEnumerable<MyDataType>
@{
Layout = null;
}
@foreach(var link in Model){
Html.RouteLink(link.Text, link.RouteValues);
}
Run Code Online (Sandbox Code Playgroud)
我一无所获.抛出没有异常,我只是没有得到任何渲染.我知道问题不在于控制器方法(它在ASCX局部视图中效果很好).
这里发生了什么?
我正在Azure Woker角色中托管WCF服务,就像这样.
我希望能够定期"回收"WCF服务主机.问题是,我假设服务正在运行它自己的应用程序域,而且我也没有办法查询它的任何事件,我也可以共享辅助角色和WCF服务之间的通用数据.
作为参考,这是托管的最小代码:
public override void Run()
{
using(var host = new ServiceHost(typeof(MyService))
{
// Configure host here...
host.Open
while(true)
{
Sleep(1000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想每24小时以某种方式"重新启动"主机,但我不知道如何实现这一目标.
我注意到,我的存储库是否将对象或基元作为参数,或者CREATE方法是仅返回int(来自DB的ID)还是完整的对象,实际上没有任何押韵或理由.
所以我的问题是,存储库应该传递并返回对象或原语吗?你能就这件事给出什么建议?你能分享任何陷阱或经验吗?
例:
public class ProductRepository : IProductRepository
{
// Pass in the whole object to the repo method...?
public int Add(Product product)
{
// return just the productId...?
}
// Pass in the individual primitive values...?
public Product Add(string productName, decimal productPrice, string description)
{
// return the whole Product object...?
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要来自多个对象的信息呢?当然,从OOP的角度来看,最好在这里传递物品,不是吗?(我在这里厚颜无耻......)
public int Add(int merchantId, Product product)
{
// database call needs merchant info...
}
public int Add(Merchant merchant, Product product)
{
var merchantId = merchant.ID; …Run Code Online (Sandbox Code Playgroud) 我有一个Action方法返回一个JSON序列化的对象.我遇到的问题是返回的JSON是在新页面中打开,而不是由jquery.Ajax方法的"success"函数处理.
这是控制器动作:
[HttpPost]
public ActionResult AddAssignment(AssignmentViewModel avm)
{
db.Assignments.Add(new Assignment
{
Name = avm.Name,
DueDate = DateTime.Parse(avm.DueDate),
CourseID = avm.CourseID,
IsComplete = false
});
db.SaveChanges();
avm.Course = db.Courses
.Where(x => x.CourseID == avm.CourseID)
.SingleOrDefault()
.Name;
return Json(avm);
}
Run Code Online (Sandbox Code Playgroud)
这是视图(表单):
@model Fooburg.Mvc.Models.AssignmentViewModel
<h2 style="margin: 0 0 24px 0">Add Assignment:</h2>
@using (Html.BeginForm("AddAssignment",
"Assignments",
FormMethod.Post,
new { @id = "add-assignment-form" }))
{
<dl class="tabular">
<dt>Course:</dt>
<dd>
@Html.DropDownListFor(x => x.CourseID, new SelectList(ViewBag.Courses, "CourseID", "Name"))
</dd>
<dt>Assignment:</dt>
<dd>
@Html.TextBoxFor(x => x.Name)
</dd>
<dt>Due Date:</dt>
<dd> …Run Code Online (Sandbox Code Playgroud) 假设您有以下Generic类heirarchy:
public abstract class GenericBase<T>
{
T SomeProperty{ get; set; }
}
public class Foo<T>
{
T SomeProperty{ get; set; }
}
public abstract class GenericChild<T> : GenericBase<T>
{
// ...
public bool DoSomething(Foo<T> foo)
{
// This is invalid:
return SomeProperty == foo.SomeProperty;
}
}
Run Code Online (Sandbox Code Playgroud)
DoSomething方法中的相等检查将无法编译.它会产生以下错误:
Operator '==' cannot be applied to operands of type 'T' and 'T'
Run Code Online (Sandbox Code Playgroud)
如果它是相关的,这些类是在单独的文件中.允许这种平等比较的最佳解决方法是什么?在C#中是否存在某种模式或某些东西?
更新:
一些答案建议使用:
where T : SomeClass
Run Code Online (Sandbox Code Playgroud)
不幸的是,T经常会是一种原始类型.
假设您有以下类声明:
public abstract class Foo
{
public class Bar
{
public virtual void DoSomething() { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以覆盖Foo的子类中的Bar.DoSomething(),la:
public class Quz : Foo
{
public override void Bar::DoSomething() { ... }
}
Run Code Online (Sandbox Code Playgroud)
显然语法不起作用,但是这样可能吗?
我写了一个扩展方法,可以采用任意数字或OrderBy()并递归应用它们....
我最好展示一个例子:
public static IEnumerable<User> ApplyOrdering(this IEnumerable<User> users,
int index,
params Func<User, string>[] sorts)
{
if(index == sorts.Length)
return users;
users = users.OrderBy(sorts[index]);
index++;
return users.ApplyOrdering(index, sorts);
}
// And it's called like this:
void Example()
{
var users = GetUnsortedUsers();
var sortedUsers = users.ApplyOrdering(0, u => u.DisplayName,
u => u.Username,
u => u.Email);
}
Run Code Online (Sandbox Code Playgroud)
这不是一个问题,但我想知道这是否可以以更好,更优雅的方式完成?
首先,我不喜欢在方法调用中声明起始索引.另一个可能的挑剔是必须调用.ApplyOrdering(),最后一次只是为了返回用户.
你觉得怎么样?!我很想看到C#大师们提出的一些聪明的解决方案!
编辑:我知道你们中的一些人会指出,只需编写这样的查询就会更好,更具表现力:
var orderedUsers = users.OrderBy(u => u.DisplayName)
.ThenBy(u => u.Username)
.ThenBy(u => u.Email);
Run Code Online (Sandbox Code Playgroud)
但在我的场景中,过滤器的数量和类型并不总是相同,所以我需要一个可以容纳任意数量的过滤器的通用解决方案.
如果我有以下集合:
var foos = new List<Foo>
{
new Foo{ Name = "A", Value = 1 },
new Foo{ Name = "B", Value = 1 },
new Foo{ Name = "B", Value = 2 },
new Foo{ Name = "C", Value = 1 },
};
Run Code Online (Sandbox Code Playgroud)
我想最终:
A-1
B-2
C-1
Run Code Online (Sandbox Code Playgroud)
在复制"B"的情况下,我想选择具有最高值的"B"?
就像是:
var filteredFoos = foos.GroupBy(x => x.Name).Select_Duplicate_With_Highest_Value
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×4
oop ×3
linq ×2
ajax ×1
asp.net-mvc ×1
azure ×1
generics ×1
group-by ×1
ienumerable ×1
inheritance ×1
jquery ×1
json ×1
orm ×1
razor ×1
repository ×1
wcf ×1