我在asp.net mvc3应用程序中遇到客户端验证问题.
我的代码看起来:
function loadEditCategoryDialog(categoryId) {
$.ajax({
url : "/rovastamp3/Admin/CategoryEditDialog",
data : "categoryId="+categoryId,
success : function(data){
$("#popup_dialog").html(data);
$("#popup_dialog").dialog({
modal: true,
draggable: false,
resizable: false,
title: "Upravit kategorii",
width: 600,
height: 500,
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
控制器:
[HttpGet]
public ActionResult CategoryEditDialog(int categoryId)
{
CategoryEditViewModel categoryEditViewModel = new CategoryEditViewModel();
categoryEditViewModel.Category = _postAuctionCategoryRepo.Query()
.SingleOrDefault(x => x.Id == categoryId);
return PartialView(categoryEditViewModel);
}
[HttpPost]
public ActionResult CreateNewCategory(CategoryEditViewModel categoryEditViewModel)
{
if (ModelState.IsValid)
{
return RedirectToAction("Index");
}
return View("CategoryEditDialog", categoryEditViewModel);
}
Run Code Online (Sandbox Code Playgroud)
最后我的部分观点是:
@model Rovastamp.MVC3.ViewModels.AdminController.CategoryEditViewModel
<h2>Upravit kategorii @Model.Category.Name</h2> …Run Code Online (Sandbox Code Playgroud) 在MVC中,ModelValidatorProvider实例化并调用a以在每个请求上验证模型.这意味着在DI环境中,它可以依赖于单个请求中作用域的对象,例如工作单元或数据库上下文.在Web API中,这似乎已经发生了重大变化.而不是按请求实例化,ModelValidatorProvider似乎是在应用程序启动期间长期存在并实例化的.然后,WebAPI缓存来自ModelValidatorProviderper类型的结果,这意味着ModelValidator不能从DI中获取任何依赖性.
我正在尝试ModelValidator使用服务定位器实现我使用工厂(请不要自动'反模式'注释!).这将允许我在每个请求中构造一个内部验证器对象,它可以从容器中获取依赖关系.但是,我无法获得一个依赖性解析器或容器作为当前请求的范围,该请求ModelValidator主要是作为Singleton的范围.我试过使用GlobalConfiguration.Configuration.DependencyResolver,但这只返回全局范围的服务(从根范围,这里也提到)
我在Autofac工作,因此特定于autofac的解决方案是合适的(例如MVC具有AutofacDependencyResolver.Current,内部使用DependencyResolver.GetService).WebAPI集成中没有可用的等价物,可能是因为上面提到的全局DependencyResolver仅返回全局范围服务的原因.
我尝试这样做(以及我自己使用)的原因是为FluentValidation实现Web API集成,目前不存在.到目前为止已经进行了两次尝试,但这些尝试都没有处理依赖注入问题,而是导致单个静态ModelValidator.
到目前为止我尝试过的事情:
GlobalConfiguration.Configuration.DependencyResolver(返回根作用域中的对象)Func<IComponentContext>(总是返回根上下文)在已删除的答案中,建议IModelValidatorProvider从Web API配置中删除服务.这必须使用反射来完成,因为接口和实现类都被定义为内部,但它确实使验证器更好地工作(因为ModelValidator是按请求构造的).但是,由于使用反射来检查模型上的验证器及其具有的每个属性,因此以这种方式执行它会有显着的性能损失,因此我不想采用此选项.
Filip W的回答建议使用HttpRequestMessage获取依赖范围,但是我没有找到任何HttpRequestMessage.Current可以在长期存在的对象中提供对该对象的访问的东西- 如果可以实现,我相信一切都会落到实处.
很多关于stackoverflow的研究告诉我,从其他域获取/设置cookie是不可能的.
但我可以看到youtube.com正在通过google.com这样做

那他们怎么样呢?
是否可以在Entity Framework 5 Code First中自动生成的多对多链接表中有选择地删除Cascade Delete选项?这是一个需要它的简单示例:
public class Parent
{
public int Id { get; set; }
public virtual IList<ChildA> As { get; set; }
public virtual IList<ChildB> Bs { get; set; }
}
public class ChildA
{
public int Id { get; set; }
[Required]
public virtual Parent Parent { get; set; }
public virtual IList<ChildB> ChildBJoins { get; set; }
}
public class ChildB
{
public int Id { get; set; }
[Required]
public virtual Parent Parent { …Run Code Online (Sandbox Code Playgroud) 我希望找到一种更好的方法(可能有一个很好的linq表达式)将像"41,42x,43"这样的字符串列表转换为有效long的列表.下面的代码有效,但感觉很难看.
string addressBookEntryIds = "41,42x,43";
var ids = addressBookEntryIds.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries);
var addressBookEntryIdList =new List<long>();
foreach (var rec in ids)
{
long val;
if (Int64.TryParse(rec, out val))
{
addressBookEntryIdList.Add(val);
}
}
Run Code Online (Sandbox Code Playgroud) 我收到此错误:无法从“int”转换为“System.Predicate ServerHomeWork.Models.Organization”
在 OrgList.Add(Organization.Find(UTO.OrganizationId); 行的一部分,属性 UTO.OrganizationId 是一个 int 但仍然表示出了问题。任何人都可以告诉我这里出了什么问题吗?
代码在这里:
public virtual List<Organisation> Organisation
{
get
{
List<UsersToOrganisations> UserToOrg = UsersToOrganisations.FindListOfOrganisations(UserId);
List<Organisation> OrgList = new List<Models.Organisation>();
if (UserToOrg.Count > 0)
foreach (UsersToOrganisations UTO in UserToOrg)
OrgList.Add(Organisation.Find(UTO.OrganisationId));
else
OrgList.Add(new Organisation("No organisation was found.", 0));
return OrgList;
}
}
Run Code Online (Sandbox Code Playgroud)
这是 UserToOrganization 类
class UsersToOrganisations
{
public int Id { get; set; }
public int UserId { get; set; }
public int OrganisationId { get; set; }
public bool MainOrganisation { get; set; …Run Code Online (Sandbox Code Playgroud) 我有一个控制台应用程序。在发布环境中,此时它可以完美运行。在 IDE 调试环境中,我不想关闭控制台窗口,所以我添加了这个函数,并在我的程序的最后调用它。
[Conditional("DEBUG")]
public static void DebugWaitAKey(string message = "Press any key")
{
Console.WriteLine(message);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
当我调试程序时,它对我来说效果很好。但是通过单元测试,它在退出之前仍然等待一个键!
解决方法只是我的程序的单元测试发行版,或测试其他功能。但我确实想要一些可以识别当前会话正在进行单元测试的东西,并在这个函数中使用该标志。
NUnit遇到超时时究竟做了什么?我曾经认为它会通过抛出TimeoutException来中止测试,但是这个测试证明不是这样:
[Test, Timeout(100), ExpectedException(typeof(TimeoutException))]
public static void RaisingExpectedTimeoutException()
{
Thread.Sleep(500);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,nunit控制台只报告违反超时,但不报告测试是如何中止的.是否有人知道这将如何工作?为什么上面的测试没有引起我预期的TimeoutException?(即使它是.NET异常类型,我认为NUnit使用Exception来处理超时违规).
PS:这个测试方法也失败了:
[Test, Timeout(100), ExpectedException(typeof(ThreadAbortException))]
public static void RaisingExpectedThreadAbortException()
{
Thread.Sleep(500);
}
Run Code Online (Sandbox Code Playgroud)
并且这种测试方法成功("没有人期待西班牙的调查!"):
[Test, ExpectedException(typeof(ThreadAbortException))]
public static void ThrowingExpectedThreadAbortException()
{
Thread.CurrentThread.Abort();
}
Run Code Online (Sandbox Code Playgroud) 如何从IOwinContext获取浏览器?
我试图在我的owin中间件(下面的代码)的响应中记录请求.
public async override Task Invoke(IOwinContext context)
{
var sw = new Stopwatch();
sw.Start();
var user = context.Authentication.User.Identity.IsAuthenticated ?
context.Authentication.User.Identity.Name :
"anonymous";
_logger.WriteVerbose(
string.Format("{0} {1} '{2}{3}{4}' @ {5} for {6}",
context.Request.Scheme,
context.Request.Method,
context.Request.PathBase,
context.Request.Path,
context.Request.QueryString,
context.Request.LocalIpAddress,
user));
await Next.Invoke(context);
_logger.WriteVerbose(
string.Format("{0} {1} {2}ms - {3}",
context.Response.StatusCode,
context.Request.Path,
sw.ElapsedMilliseconds,
context.Request.Browser); //???
}
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我想依赖一个类中的多个存储库,每次都不需要所有存储库。我没有在不必要的情况下为每个实例构建一个实例,而是使用了Windsor 中的Typed Factory 工具。
然而,为每个存储库注册一个工厂有点烦人,我想用一个开放的通用注册来代替它。我想要做的是如下所示:
container.Register(
Component.For<IFactory<IRepository<>>>().AsFactory()
);
Run Code Online (Sandbox Code Playgroud)
但是,这是一个语法错误,因为缺少 IRepository 的类型参数。有没有我可以使用的语法来完成这项工作?
注意:我知道我可以注册一个无类型的 Factory 接口并使用它来创建多个组件。我对这样做不感兴趣,因为这基本上依赖于服务定位器 - 如果我没有注册依赖项,那么在代码尝试使用它之前我不会知道它 - 用我知道的方法即使我还没有创建实例,在构造函数中也有 this。
完整(简化)示例如下:
public class TestA { }
public class TestB { }
public interface IRepository<T> { T Create(); }
public class Repository<T> : IRepository<T>
{
public T Create() { return Activator.CreateInstance<T>(); }
}
public interface IFactory<T>
{
T Create();
void Release(T instance);
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Register(
// Individual …Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×2
asp.net-mvc ×2
autofac ×1
c#-4.0 ×1
console ×1
cookies ×1
dialog ×1
http ×1
jquery-ui ×1
linq ×1
nunit ×1
owin ×1
unit-testing ×1
validation ×1