当前位置: 首页 > 知识库问答 >
问题:

实体框架在本地编辑/删除记录作品

沈华皓
2023-03-14

我有一个在Azure中运行的Web应用程序。我设置了实体框架来访问我的数据库。“编辑”和“删除”视图在我的本地计算机上以及部署到临时插槽时工作。当我推到生产槽时,我得到一个错误。出于某种原因,控制器没有读取记录ID,即使它显然是在URL中传递的,并且是在RouteConfig中设置的。

更新:这是请求。https://teamweb.azurewebsites.net/JobTracking/Edit/41ba2cca-3e6c-4920-9f2f-92f656ab4374我收到一个500的错误。

更新2:这是例外

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier或http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider类型的索赔在提供的索赔身份中不存在。若要通过基于声明的身份验证启用反伪造令牌支持,请验证配置的声明提供程序是否在其生成的ClaimsId相实例上提供了这两种声明。如果配置的声明提供程序使用不同的声明类型作为唯一标识符,则可以通过设置静态属性AntiForgeryConfig来配置它。ai.snapshot.versionv2ai.snapshot.id6404b56bd53c4cd58857cc3c7bbb08f5ai.snapshot.stampideastus-eit7xiflzk3gi System.无效操作异常:提供的声明身份中没有http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier或http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider类型的声明。若要通过基于声明的身份验证启用反伪造令牌支持,请验证配置的声明提供程序是否在其生成的ClaimsId相实例上提供了这两种声明。如果配置的声明提供程序使用不同的声明类型作为唯一标识符,则可以通过设置静态属性AntiForgeryConfig来配置它。UniqueClaimType标识符。

at System.网页。帮手。AntiXsrf.ClaimUidExtractor.GetUniqueIdfierParameters(声明身份声明身份,字符串uniqueClaimType标识符)

在系统中。网状物帮手。抗XSRF。索赔人。ExtractClaimUid(身份标识)

at System.网页。帮手。AntiXsrf.TokenValidator.GenerateFormToken(HttpContextBase http pContext,IId实体标识,AntiForgeryToken CookieToken)

在系统中。网状物帮手。抗XSRF。防霉剂工人。GetTokens(HttpContextBase httpContext,AntiForgeryToken oldCookieToken,AntiForgeryToken

在系统中。网状物帮手。抗XSRF。防霉剂工人。GetFormInputElement(HttpContextBase httpContext)

在系统中。网状物帮手。防暴药。GetHtml()

at System.网页。mvc.HtmlHelper.反伪造令牌

在ASP_页面\查看\作业跟踪\编辑\ cshtml。在D:\home\site\wwwroot\Views\JobTracking\Edit中执行()。cshtml:第17行

at System.网页。网页。网页库。层次结构

在系统中。网状物Mvc。WebViewPage。ExecutePageHierarchy()

在系统中。网状物网页。起始页。ExecutePageHierarchy()

at System.网页。网页。网页库。执行页面层次结构(WebPageContext pageContext, TextWriter作家, WebPageRenderingBase starPage)

在系统中。网状物Mvc。ViewResultBase。ExecuteSult(ControllerContext上下文)

at System.网页。mvc.Invoker.InvokeActionResultFilterRecursive(IList'1过滤器,Int32过滤器索引,ResultExecutingContext预上下文,控件上下文控制上下文,动作结果actionResult)

at System.网页。mvc.Invoker.InvokeActionResultFilterRecursive(IList'1过滤器,Int32过滤器索引,ResultExecutingContext预上下文,控件上下文控制上下文,动作结果actionResult)

在系统中。网状物Mvc。ControllerActionInvoker。InvokeActionResultWithFilters(ControllerContext ControllerContext,IList`1筛选器,ActionResult ActionResult)

at System.网页。mvc.不同步。AsyncControlllerActionInvoker.

以下是RouteConfig代码

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "JobTracking/{action}/{id}",
                defaults: new { controller = "JobTracking", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Home",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
         }
    }

这是控制器中的代码

// GET: JobTracking/Edit/5
        public ActionResult Edit(Guid? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Job_Tracking job_Tracking = db.Job_Tracking.Find(id);
            if (job_Tracking == null)
            {
                return HttpNotFound();
            }
            return View(job_Tracking);
        }

共有1个答案

越信鸥
2023-03-14

您需要告诉AntiForgeryConfig在全局的应用程序启动方法中使用名称标识符。尽快。cs

AntiForgeryConfig。UniqueClaimTypeIdentifier=索赔类型。名称标识符

如果您没有指定ClaimType。Name标识符然后您可能会在更改后收到以下错误:

类型的索赔http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier“在所提供的索赔中不存在。

要解决此问题,您可以指定一个NameIdentifier,这将是最佳做法,如下所示:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, "username"),
    new Claim(ClaimTypes.Email, "user@email.com"),
    new Claim(ClaimTypes.NameIdentifier, "someUserId"),
};

//await UserManager.AddClaimAsync(userId, new Claim(ClaimTypes.NameIdentifier, "someUserId")); if you're using Identity's UserManager

或者,如果您有不同的唯一索赔数据可用,但没有userId,您可以将UniqueClaim标识符设置为其他内容,如下所示(不太容易接受):

AntiForgeryConfig.UniqueClaimType标识符=声明类型。电子邮件;

或者我强烈建议你远离的一个选择是从你的视野中移除防伪标志。i、 e:删除@Html。AntiForgeryToken()

 类似资料:
  • 问题内容: 我正在使用EF 4 STE对附件对象进行建模。该 附件 包含了名称,描述,日期,以及最重要的数据()。为了优化加载,我不想在绝对必要之前(即当用户从客户端单击时)检索Data属性。 为了遵循这种方法,我使用了此处描述的表拆分技术。我将“ 附件” 表分为“ 附件” (“名称”,“描述”,“日期”)和“ AttachmentData” (数据)。在我的EF模型中,这是一对一的关系。一切正常

  • 我有2个实体类(表A的实体和表B的实体)。表 A 链接到表 B。因此,实体类具有 B 实体的对象列表,并声明如下图所示。 @OneToMany(mappedBy=“AEntity”,cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)private List items=new ArrayList(); 如果我使用“entityManager.remov

  • 我们正在启动一个新应用程序。我们想使用实体框架。我们几乎不怕意外删除sql行(尤其是意外设置相关数据等) 我想禁用每一次删除,因为我们只是用“validUntil”列标记每一行,而从不删除行。 我看到它可以通过sql中的角色来完成,但我希望所有逻辑和控制都只在代码中。 也许在实体框架核心中有新的特性来支持这一点?我知道它仍然可以用EF编写行sql,但我们并不害怕这种情况。 我还尝试删除实体关系的s

  • 问题内容: 不太确定如何措辞这个问题,但是就到这里了。我正在一个项目中,其中多个客户端应用程序正在通过WCF服务访问一个数据源。可能无关紧要,但是WCF服务正在利用实体框架来访问此数据源。每当客户端查询记录以进行编辑时,我都希望在第一个客户端完成更新之前,其他客户端无法编辑该记录。 如果我错了,请纠正我,但我相信这也称为同步和异步数据访问。 我的问题是,实现此功能的行业最佳实践是什么?有没有一种方

  • 问题内容: 我有一个在本地完美运行的Web项目。但是,当我在Azure上已发布的网站中更改连接字符串以连接到SQL Azure上的数据库时,它将开始出现此错误。 我的配置有: 我使用该连接字符串在本地使用单元测试进行了测试,并且该测试可以从连接到SQL Azure数据库的本地计算机上运行。任何帮助表示赞赏。 问题答案: 我今天遇到了这个确切的问题;这是我第一次部署到Azure。我一直在拔头发,除了

  • 在我的项目中,我有两个实体与@OneTomany和@ManyToOne相关。看看这些照片- 我的问题-当我从供应品中删除记录时,也会从产品中删除记录,但我不会这样做。如果我删除CascadeType.All,然后重试此操作,将出现错误 com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新