小编Iai*_*way的帖子

在C#事件处理程序中,为什么"sender"参数必须是一个对象?

根据Microsoft事件命名准则,senderC#事件处理程序中的参数" 始终是类型对象,即使可以使用更具体的类型".

这导致了许多事件处理代码,如:

RepeaterItem item = sender as RepeaterItem;
if (item != null) { /* Do some stuff */ }
Run Code Online (Sandbox Code Playgroud)

为什么约定建议不要使用更具体的类型声明事件处理程序?

MyType
{
    public event MyEventHander MyEvent;
}

...

delegate void MyEventHander(MyType sender, MyEventArgs e);
Run Code Online (Sandbox Code Playgroud)

我错过了一个陷阱吗?

对于后人:我同意的答案一般情绪的惯例使用对象(并通过传递数据EventArgs),即使它是可以使用更具体的类型,而在现实世界编程它按照重要大会.

c# events

71
推荐指数
4
解决办法
2万
查看次数

装配绑定重定向和代码分析

我在Visual Studio 2010中的Mvc 3.0.0.0项目中使用DotNetOpenAuth(引用System.Web.Mvc版本1.0.0.0).

我正在使用程序集绑定重定向,如下所示: -

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

一切正常,除了代码分析,它给我以下错误: -

CA0001:读取模块X时遇到以下错误:无法解析程序集引用:System.Web.Mvc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35.

CA0058:找不到引用的程序集"System.Web.Mvc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35".此程序集是分析所必需的,并引用:X.

有没有办法让代码分析工具尊重程序集绑定重定向?

code-analysis visual-studio-2010 assemblybinding visual-studio

44
推荐指数
2
解决办法
9313
查看次数

ASP.NET MVC中的访问控制取决于输入参数/服务层?

序言:这是一个哲学问题.我正在寻找更好的"正确"方式来做到这一点而不是"一种"方式来做到这一点.

让我们假设我有一些产品,以及在这些产品上执行CRUD的ASP.NET MVC应用程序: -

mysite.example/products/1
mysite.example/products/1/edit
Run Code Online (Sandbox Code Playgroud)

我正在使用存储库模式,因此这些产品来自何处并不重要: -

public interface IProductRepository
{
  IEnumberable<Product> GetProducts();
  ....
}
Run Code Online (Sandbox Code Playgroud)

我的存储库还描述了一个用户列表,以及他们管理的产品(用户和产品之间的许多产品).在应用程序的其他地方,Super-Admin正在对用户执行CRUD并管理用户与他们被允许管理的产品之间的关系.

任何人都可以查看任何产品,但只允许为特定产品指定为"管理员"的用户调用例如编辑操作.

应该如何在ASP.NET MVC中实现它?除非我错过了什么,否则我不能使用内置的ASP.NET Authorize属性,因为我需要为每个产品使用不同的角色,其次我不知道要检查哪个角色直到我从存储库中检索了我的产品.

显然,您可以将此场景概括为大多数内容管理方案 - 例如,用户只能编辑自己的论坛帖子.StackOverflow用户只能编辑他们自己的问题 - 除非他们有2000或更多代表...

作为一个例子,最简单的解决方案是:

public class ProductsController
{
  public ActionResult Edit(int id)
  {
    Product p = ProductRepository.GetProductById(id);
    User u = UserService.GetUser(); // Gets the currently logged in user
    if (ProductAdminService.UserIsAdminForProduct(u, p))
    {
      return View(p);
    }
    else
    {
      return RedirectToAction("AccessDenied");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 这些代码中的一部分需要重复 - 假设有几个操作(Update,Delete,SetStock,Order,CreateOffer),这取决于User-Products关系.你必须多次复制粘贴.
  • 它不是很可测试 - 你必须通过我的计数来模拟每个测试的四个对象.
  • 检查用户是否被允许执行操作似乎并不像控制器的"工作".我更倾向于更可插拔(例如通过属性的AOP)解决方案.但是,这是否意味着您必须两次选择产品(一次在AuthorizationFilter中,一次在Controller中)?
  • 如果不允许用户提出此请求,返回403会更好吗?如果是这样,我将如何做到这一点?

我可能会保持这个更新,因为我自己有想法,但我非常渴望听到你的想法!

提前致谢!

编辑

只是在这里添加一些细节.我遇到的问题是,我希望业务规则"只有具有权限的用户可以编辑产品"才能包含在一个且只有一个地方.我觉得确定用户是否可以对"编辑"操作进行GET或POST的相同代码也应该负责确定是否在"索引"或"详细信息"视图上呈现"编辑"链接.也许这不可能/不可行,但我觉得应该...... …

asp.net-mvc

41
推荐指数
2
解决办法
1万
查看次数

ASP.NET MVC自定义错误

我的目标是在应用程序中创建一个处理所有托管错误的错误处理,而不仅仅是与MVC相关.所以我没有使用HandleErrorAttribute模式,因为它仅用于MVC错误,而不是其他托管错误.

在我的Global.asax中,我有:

protected void Application_Error()
{
    string displayError = ConfigurationManager.AppSettings["DisplayError"];
    NameValueCollection serverVariables;
    int loop1, loop2;
    StringBuilder serverVariableKeys = new StringBuilder();
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;

    if (HttpContext.Current != null)
    {
            // loop through and get server vars
    }

    if (exception != null)
        // Log Error

    // Redirect to Error page if set to basic mode
    if (!string.IsNullOrWhiteSpace(displayError) && displayError.ToLower() == "basic")
    {
        Response.Clear();
    Server.ClearError(); // needed for redirect to work

    var routeData = new RouteData(); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc asp.net-mvc-4

20
推荐指数
1
解决办法
2万
查看次数

实体框架中内容的国际化

我不断遇到i18n要求,我的数据(不是我的用户界面)需要国际化.

public class FooEntity
{
  public long Id { get; set; }
  public string Code { get; set; } // Some values might not need i18n
  public string Name { get; set } // but e.g. this needs internationalized
  public string Description { get; set; } // and this too
}
Run Code Online (Sandbox Code Playgroud)

我可以使用哪些方法?

我试过的一些事情: -

1)在db中存储资源键

public class FooEntity
{
  ...
  public string NameKey { get; set; }
  public string DescriptionKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  • 优点:无需复杂的查询即可获得翻译的实体.System.Globalization处理你的后备.
  • 缺点:管理员用户无法轻松管理翻译(每当我Foo …

entity-framework internationalization

18
推荐指数
1
解决办法
2066
查看次数

AutoMapper Project().To()和排序子集合

我有一个对象图,我正在使用EF CodeFirst和AutoMapper从数据库加载到DTO中: -

public class Foo
{
  public int Id { get; set; }
  public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
  public int Id { get; set; }
  public int FooId { get; set; }
  public virtual Foo Foo { get; set; }

  public string Name { get; set; }
  public int SortOrder { get; set; }
}

public class FooDto
{
  public IEnumerable<BarDto> Bars { get; set; }
}

public class BarDto
{ …
Run Code Online (Sandbox Code Playgroud)

c# iqueryable automapper

15
推荐指数
1
解决办法
9966
查看次数

如果代码覆盖率低于TFS2012中的阈值,则构建失败

当代码覆盖率低于阈值时,我试图在TFS服务(托管TFS2012)中失败构建.

我一直在讨论http://scrumdod.blogspot.co.uk/2011/04/fail-build-if-code-coverage-is-low.html上的解决方案.

但是,我正在使用TFS2012,很多东西似乎已经改变了.特别是,测试运行的配置完全不同,似乎没有任何方法可以在构建过程模板或.runsettings文件中获取或设置.coverage文件的位置和名称.

我如何在TFS2012或TFSService中查找(或设置).coverage文件的位置?

另外,如果代码覆盖率低于阈值,还有另一种方法可以使构建失败吗?

continuous-integration code-coverage tfs2012 azure-devops

11
推荐指数
1
解决办法
3963
查看次数

MVC Contrib VerificationException

我已阅读此帖,我想使用ControllerExtensions.RedirectToAction方法.但我有System.Security.VerificationException其中说:类型参数'[MyController type]'违反了类型参数'T'的约束.

我的控制器声明如下:

   public class ProductsSearchController : Controller
   {
        ...
   }
Run Code Online (Sandbox Code Playgroud)

请帮帮我.我还尝试从这里下载最新的MvcContrib库.它没有帮助我.

我注意到一个有趣的事实.只有在从单元测试中调用时才会出现此异常.但是从网站上使用时也不例外.但它似乎无法正常工作.当我将对象传递给表达式中的动作时,如下所示:

this.RedirectToAction(x => x.Index(filter))
Run Code Online (Sandbox Code Playgroud)

它只是调用.ToString这个对象!我得到这样的网址:

产品搜索?过滤= WebShop.FinderModel.Filters.ProductsFilter

怎么了?

c# asp.net-mvc mvccontrib

10
推荐指数
1
解决办法
1744
查看次数

实体框架代码优先和CA2227"集合属性应该是只读的"

Entity Framework Code First中的一对多或多对关系如下所示: -

public class Foo
{
  public int Id { get; set; }
  public virtual ICollection<Bar> Bars { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这违反了代码分析规则2227"集合属性应该只读".

使setter受到保护并没有帮助,并将其设为私有: -

public class Foo
{
  public int Id { get; set; }
  public virtual ICollection<Bar> Bars { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后当然违反了CA1811"Foo.Bars.set(ICollection <Bar>)似乎没有上游公共或受保护的呼叫者".

我宁愿不全局关闭规则,因为它存在的预防情况相当重要,但每次我想声明关系时在本地抑制它似乎都没有了.有没有办法声明不违反CA2227的关系?

code-analysis entity-framework ef-code-first

9
推荐指数
2
解决办法
2369
查看次数

是否有任何理由在此代码块中的List <T>中找不到现有项?

我们有一个绑定到List<T>项目的网格.只要用户点击"刷新",就会从数据库中获取更改,并更新绑定列表.我遇到了一个问题,即重复项目被添加到网格中,我无法弄清楚原因.

数据库调用返回两个值:List<int>已更改的记录ID,以及已更改记录List<MyClass>的更新数据.我正在调试的现有代码代码找出需要更新的内容,如下所示:

public void FindUpdates(IList<MyClass> existingRecords,
                    IList<MyClass> updatedRecords,
                    List<int> updatedIds,
                    out IDictionary<int, int> existing,
                    out IDictionary<int, int> updated,
                    out List<int> updates,
                    out List<int> removes,
                    out List<int> adds)
{
    updates = new List<int>();
    removes = new List<int>();
    adds = new List<int>();

    existing = FindUpdated(existingRecords, updatedIds);
    updated = FindUpdated(updatedRecords, updatedIds);

    if (updatedIds != null)
    {
        // split add/update and remove
        foreach (int id in updatedIds)
        {
            if (!existing.ContainsKey(id))
                adds.Add(id);
            else if (updated.ContainsKey(id))
                updates.Add(id);
            else
                removes.Add(id);
        } …
Run Code Online (Sandbox Code Playgroud)

c# .net-3.5 devexpress-windows-ui

9
推荐指数
1
解决办法
496
查看次数