使用此代码,我可以在 C# 中设置 CRM 实体的状态和状况。
SetStateRequest appointmentRequest = new SetStateRequest
{
State = new OptionSetValue(3), //Scheduled
Status = new OptionSetValue(5), //Busy
EntityMoniker = new EntityReference("appointment", myEntity.Id)
};
crmsvc.Execute(appointmentRequest);
Run Code Online (Sandbox Code Playgroud)
在此之前的几行我正在使用创建相同的实体
crmsvc.Create(myEntity);
Run Code Online (Sandbox Code Playgroud)
在两个请求中执行此操作似乎很愚蠢,因此我寻找一种在一个请求中执行此操作的方法。
发现这个问题我需要设置自定义实体的状态和状态代码,似乎可以在保存之前设置状态代码,但我找不到任何使用状态执行此操作的示例。
尝试这样做,但它不起作用
myEntity["state"] = new OptionSetValue(3);
Run Code Online (Sandbox Code Playgroud)
它返回:
实体不包含名称 = 'state' 的属性。(故障详细信息等于 Microsoft.Xrm.Sdk.OrganizationServiceFault):“Entity”实体不包含名称 =“state”的属性。
那么state和statuscode可以在第一次保存之前设置吗?
我正在处理一个 MVC5 项目。在这个项目中,我在几乎每次对客户的回复中都有一些我一直想做的事情。
\n\n例如,我总是想查看用户是否登录,如果登录,则将用户的名称及其 ID 放入 ViewBag 变量中,以便在 .cshtml 文件中使用。
\n\n我有一个所有其他控制器都继承自的基本控制器。我的第一个想法是在该控制器的构造函数中执行这些操作,但这不起作用,因为变量User尚不存在。
是否有另一种方法可以做到这一点,而无需在每个 Action 中调用 Setup() 方法?\n我可以侦听在返回 ActionResult 之前触发的某些事件并在那里插入我的 ViewBag 数据吗?
\n\n不起作用的示例;)
\n\n[InitializeSimpleMembership]\npublic class BaseController : Controller\n{\n protected USDatabase _database = new USDatabase();\n public BaseController()\n {\n if (User.Identity.IsAuthenticated == true)\n {\n var usr = _database.UserProfiles.Where(x => x.UserName.ToLower() == User.Identity.Name.ToLower()).FirstOrDefault();\n if (usr != null)\n {\n ViewBag.UserName = usr.UserName;\n ViewBag.UserId = usr.Id;\n }\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n阅读以下答案中的想法后我的解决方案:
\n\n创建了一个我在基本控制器上触发的动作过滤器。
\n\npublic class UserDataFilter : ActionFilterAttribute\n{\n //OnActionExecuting …Run Code Online (Sandbox Code Playgroud) 我有这样的数据:
"RequirementLevels": {
"285960000":"Black",
"285960001":"Green",
"285960002":"Blue",
"285960003":"Purple"
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的选择:
<select ng-options="key as value for (key , value) in Variables.Template.RequirementLevels"
ng-model="Variables.EditingNode.RequirementLevel"
ng-model-options="{ debounce: 300 }"></select>
<span>"{{Variables.EditingNode.RequirementLevel}}"</span>
Run Code Online (Sandbox Code Playgroud)
请注意string:选择选项中每个值前面的 。使用下面的代码我没有得到string:值。
<select ng-model="Variables.EditingNode.RequirementLevel">
<option ng-repeat="(key, value) in Variables.Template.RequirementLevels" value="{{key}}">{{value}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么我会出现string:在 ng-option 列表中,以及如何让它消失。
由于评论而更新:我想更改此设置的原因是因为 ng-model 值在其中包含该值时不起作用string:。我认为这是因为它与模型中使用“123”的选项设置中的“string:123”不匹配。
更新 2
这是创建选择的 Html。
<div class="form-group input-group">
<label for="ReviewDone">Requirement level</label>
<select ng-options="key as value for (key , value) in Variables.Template.RequirementLevels track by key"
ng-model="Variables.EditingNode.RequirementLevel"
ng-model-options="{ debounce: …Run Code Online (Sandbox Code Playgroud) 我有一个 C# 视图类,如下所示:
public class DataObject
{
public int Number { get; set; }
public dynamic Data { get; set; } // <-----
}
Run Code Online (Sandbox Code Playgroud)
在这样的 MVC 方法中使用
[HttpPost]
public ActionResult SaveData(DataObject request) {}
Run Code Online (Sandbox Code Playgroud)
问题是我想在类Data的属性中接收多种类型的对象DataObject。
也就是说,我希望这两个都可以作为有效的输入 json 对象。
类型1
{
Number: 1,
Data: {
Text: "a text"
}
}
Run Code Online (Sandbox Code Playgroud)
2型
{
Number: 2,
Data: {
Value: 1,
Options: { 1, 2, 3, 4 }
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用动态对象或其他类型的 json 库魔法来做到这一点(只是使属性动态化什么也没做)?
我想要做的就是将此数据存储在 SQL 列 nvarchar 字段中并稍后返回(通过实体框架)。
另一种解决方案是为每种类型的输入创建一个视图模型,但由于它有数百种变体,因此创建所有这些视图和相应的输入方法维护起来会很麻烦。
根据评论请求添加更多详细信息:该方法是通过 Angular …
我正在云中的 VSTS 上构建 .net core asp.net 应用程序。设置此选项时,它与我的 .net 框架的其他构建管道不同,因为您不选择要构建的解决方案,而是提供可以找到项目文件的相对(通配符)路径。
对我来说,这最终是:Portal/API/**/*.csproj
问题是,在这条路径中还有一些项目文件,我不想将其构建为该特定管道的一部分。
我尝试通过执行以下操作从构建中删除特定路径,^Portal/API/Services/IdentityServer/**/*.csproj但这没有效果。我真的宁愿不必直接指定我想要构建的所有项目,因为然后我将不得不添加应包含的任何新项目(基本上是除身份服务器项目之外的所有项目)。
那么,我可以排除通配符路径包含的项目吗?
更新。 根据这个页面:
https://blogs.infosupport.com/tfs2015-build-tasks-the-wildcard-format-explained/
我应该能够编写,Portal/API/**/*.csproj;-:Portal/API/Services/IdentityServer/**/*.csproj但这不起作用,并且使用此配置,构建存在错误,指出:未找到项目。
我试图让身份服务器 4 在 ASP Net Core 3 应用程序中使用"oidc-client": "1.10.1".
如果我将以下内容添加到我的 appsettings.json
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "acertificate.pfx",
"Password": "notmyrealpassword..orisit?"
},
"Clients": {
"dev-client": {
"Profile": "IdentityServerSPA",
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用这个客户端:
{
authority: 'https://localhost:5001/',
client_id: 'dev-client',
redirect_uri: 'http://localhost:4200/auth-callback',
post_logout_redirect_uri: 'http://localhost:4200/',
response_type: 'id_token token',
scope: 'openid profile API',
filterProtocolClaims: true,
loadUserInfo: true
}
Run Code Online (Sandbox Code Playgroud)
我得到: Invalid redirect_uri: http://localhost:4200/auth-callback
添加。
"dev-client": {
"Profile": "IdentityServerSPA",
"RedirectUris": [ "http://localhost:4200/auth-callback" ]
}
Run Code Online (Sandbox Code Playgroud)
什么也没做。如果我添加(几乎)从文档中复制的客户端配置
"Clients": [
{
"Enabled": true,
"ClientId": "dev-client",
"ClientName": "Local Development", …Run Code Online (Sandbox Code Playgroud) 我有这个方法。
[HttpGet("view/{fileId}/{width}/{height}/{name}")]
public async Task<FileStreamResult> View(Guid fileId, int width, int height, string name)
{
var fileInfo = await _fileViewer.GetImageInfo(fileId, width, height);
FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open);
return File(f, fileInfo.MimeType);
}
Run Code Online (Sandbox Code Playgroud)
它只是将调整后的图像返回到浏览器。有用。但据我所知它会泄漏内存。
FileStream f永远不会被处置。
我可以看到我的服务器内存正在慢慢耗尽。
如果我using在其中添加一条语句,则会收到流已关闭的错误,即 using 语句在文件返回给用户之前关闭。
这应该如何正确完成?
更新1。这:
using (FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open))
{
return File(f, fileInfo.MimeType);
}
Run Code Online (Sandbox Code Playgroud)
产量
System.ObjectDisposeException:无法访问已处置的对象。对象名称:“无法访问已关闭的文件。”。
我已经构建了一个小型MVC4网站,用于使用代码优先方法共享文件.这些文件存储在我的数据库中
public byte[] Content { get; set; }
Run Code Online (Sandbox Code Playgroud)
我设定了
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="536870912" />
</requestFiltering>
</security>
Run Code Online (Sandbox Code Playgroud)
和
<httpRuntime targetFramework="4.5" executionTimeout="6000" maxRequestLength="524288"/>
Run Code Online (Sandbox Code Playgroud)
要将文件大小限制为500 Mb,以便文件实际上将其放入我的代码中(先将其置于此位置).
当我收到文件并尝试将其保存到数据库时,实际问题就出现了,我称之为:
DbContext.SaveChanges()
Run Code Online (Sandbox Code Playgroud)
并得到此错误:
System.Data.Entity.dll中出现"System.OutOfMemoryException"类型的异常,但未在用户代码中处理
我猜这是因为我在数据库中的byte []中存储了多少数据(或者我的进程允许使用多少内存),因此我遇到了某种限制.在上传较小的文件时,一切都有效.
数据库服务器是SQL 2008 R2 Standard服务器.
为了简单起见,我宁愿避免将文件存储在磁盘上.我的选择是什么?
编辑:使用直接SQL查询插入文件的建议让我超过了将文件导入数据库的第一个问题:
DbContext.Database.ExecuteSqlCommand(
@"UPDATE FileContents
SET Content = @data
WHERE ID = @id",
new SqlParameter("id", content.ID), new SqlParameter("data", bytearray));
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从文件夹中取出文件时,我现在得到完全相同的错误.这会导致错误:
byte[] respdata = DbContext.Database.SqlQuery<Byte[]>
("SELECT TOP 1 Content FROM FileContents WHERE ID = @id",
new SqlParameter("id", filepost.File.ID)).Single();
Run Code Online (Sandbox Code Playgroud)
同样,它适用于<100 MB的较小文件,但崩溃在200 Mb文件上.
根据以下答案中的评论添加stacktrace以进行提问:
System.OutOfMemoryException未被用户代码处理
HResult = -2147024882 Message …
连接到 CRM 2013 时,有一种智能方法可以创建 lambda 表达式来获取列表中 GUID 的实体。
此代码破坏了Where子句并给出错误:
“where”条件无效。实体成员正在调用无效的属性或方法。
代码:
private List<UserInformationProxy> GetContactsFromGuidList(List<Guid> contactList)
{
var result = _serviceContext.ContactSet
.Where(x=> contactList.Contains((Guid) x.ContactId)) // this line breaks
.Select(x => new UserInformationProxy()
{
FullName = x.FullName,
Id = x.ContactId
})
.Distinct()
.ToList<UserInformationProxy>();
return result;
}
// return class
public class UserInformationProxy
{
public Guid? Id { get; set; }
public string FullName { get; set; }
public string DomainName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
目前,我正在通过从 ContactSet 获取所有联系人并在代码中使用循环筛选出我想要的联系人来解决此问题。这可行,但速度相当慢,因为我需要获取所有 10000 个联系人,而不是将我真正感兴趣的 40 个联系人的 …
我想知道返回的枚举器是否是线程安全的:
public IEnumerator<T> GetEnumerator()
{
lock (_sync) {
return _list.GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有多个线程将数据(也在lock()块内)添加到此列表中,并且一个线程枚举此列表的内容.枚举线程完成后,清除列表.那么使用从这种方法获得的枚举器是否安全.
即,枚举器指向它所要求的实例的列表副本,还是总是指向列表本身,在枚举期间可能会或可能不会被另一个线程操纵?
如果枚举器不是线程安全的,那么我能看到的唯一其他操作方法是创建列表的副本并返回该列表.然而,这并不理想,因为它会产生大量垃圾(这种方法每秒调用约60次).
c# ×7
asp.net-core ×2
asp.net-mvc ×2
.net-core ×1
angular8 ×1
angularjs ×1
azure-devops ×1
c#-4.0 ×1
dynamics-crm ×1
json ×1
lambda ×1
sql-server ×1