我有一个.NET .ashx处理程序,它接收一个jQuery AJAX帖子,将Web服务请求格式化为第三方服务并使用结果.成功时,它使用相关信息实例化一个匿名对象并格式化JSON响应字符串.
如果Web服务错误,我会执行以下操作:
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.Response.StatusDescription = wsResult.ErrorCode;
Run Code Online (Sandbox Code Playgroud)
这使得jQuery AJAX错误回调可以轻松访问状态代码和描述; 但是,我实现这个的方式是非常武断的.
在做了一些阅读之后,我无法找到以下问题的确定答案:是否存在可接受的通用约定(或 - 甚至 - 规范),用于将错误状态返回到基于JSON的AJAX调用,这允许任何消费者知道期待什么,或者这是任意其他函数调用的返回类型?
那么,这是一种将错误状态返回给AJAX调用者的完全可接受的方式,还是有一种格式化JSON错误响应的"正确"方式?
我正在使用Owin配置我的ASP.NET MVC 5(.NET 4.5,IIS 7/8)应用程序以对第三方ADFS设置进行身份验证:
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
Wtrealm = Settings.Auth.Wtrealm,
MetadataAddress = Settings.Auth.MetadataAddress
});
Run Code Online (Sandbox Code Playgroud)
我还有一个自定义身份验证过滤器(与之配合使用AuthorizeAttribute
):
public class OwinAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
var user = filterContext.RequestContext.HttpContext.User;
var authenticated = user.Identity.IsAuthenticated;
if (!authenticated)
{
return;
}
/* Redirect to profile setup if not already complete */
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法在一半的时间内工作正常,但有时,在初始登录时,应用程序和ADFS登录之间将发生重定向循环.这似乎是特定于会话的(并非所有用户同时发生),并且一旦发生重定向循环,它似乎会继续发生,直到应用程序池刷新.
当重定向循环发生时,我仍然可以看到(在Chrome的"网络"标签中)看起来像ADFS发布的有效令牌.
我很难分离根本原因但我发现的是 - 当循环没有发生时,user.Identity
是类型ClaimsIdentity
而且IsAuthenticated
是 …
我在控制器中有一个方法ApplicationsController
,我需要获取操作方法的基本URL:
public ActionResult MyAction(string id)
{
var url = Url.Action("MyAction", "Applications");
...
}
Run Code Online (Sandbox Code Playgroud)
问题是这包括string id
当前路由数据,当我需要URL时(URL用于在基于URL的查找中从CMS获取内容).
我试过传递null
并new { }
作为routeValues
参数无济于事.
匹配路由如下(高于所有其他路由):
routes.MapLowercaseRoute(
name: "Applications",
url: "applications/{action}/{id}",
defaults: new { controller = "Applications",
action = "Index", id = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
我已经看到了其他一些问题,但它们似乎没有一个可行的解决方案.目前,我正在使用硬编码控制器中的路径; 但是,我希望能够将其抽象为动作过滤器,因此我需要能够生成URL.
是否有一种干净/传统的方法来防止这种行为?
假设我有一个类型为集合的视图,例如List<ItemViewModel>
:
@model List<ItemViewModel>
@for(int i = 0; i < Model.Count; i++)
{
@Html.EditorFor(m => m[i].Foo)
@Html.EditorFor(m => m[i].Bar)
}
Run Code Online (Sandbox Code Playgroud)
Foo
并且Bar
只是字符串属性.
这产生以下形式的HTML名称属性[i].Foo
并且[i].Bar
,其中,当然,是正确的,在一个形式发布时正确地结合.
现在假设,上面的视图是一个编辑器模板,它是这样渲染的(其中Model.Items
是a List<ItemViewModel>
):
@model WrappingViewModel
@Html.EditorFor(m => m.Items)
Run Code Online (Sandbox Code Playgroud)
突然之间,编辑器模板中生成的名称的形式就是 - 例如 - Items.[i].Foo
.默认的模型绑定器不能像预期的那样绑定它Items[i].Foo
.
这在第一个场景中运行良好 - 视图不是编辑器模板 - 并且在集合是属性的情况下工作正常,而不是整个模型:
@Html.EditorFor(m => m.Items[i].Foo)
Run Code Online (Sandbox Code Playgroud)
它仅在模型本身是集合且视图是编辑器模板时失败.
有几种方法可以解决这个问题,其中没有一个是理想的:
ItemViewModel
- 这不是好事,因为相关的实际模板包含用于添加到集合中/从集合中删除的附加标记.我需要能够使用模板中的整个集合.List<ItemViewModel>
在另一个属性中(例如通过实现ItemListViewModel
)并将其传递给模板 - 这也不是理想的,因为这是一个企业应用程序,我宁愿不用多余的包装视图模型混乱.所以,问题是:为什么NameFor
(并因此EditorFor
)在这种特殊情况下表现出这种行为,当它适用于轻微变化时(即它是有意的,如果是,为什么)?是否有一种简单的方法来解决这种行为而没有上述任何缺点?
根据要求,完整代码重现: …
我知道Ruby数组都是动态分配和动态调整大小的; 但是,我似乎无法找到关于它们是否是真正数组的任何明确信息; 即它们在内存中是连续的(更具体地说,它们所持有的引用在内存中是连续的).
我的假设是增加Ruby数组的大小需要将整个数组重新分配到更大的连续内存块(如果需要).
这是正确的,还是"阵列"在这种情况下用词不当?
我有一个.NET服务层的接口,它反过来将通过Web服务与第三方系统通信.这可以处理与第三方系统功能相关的许多不同任务(它实际上是一个定制的CRM系统,但由于上下文不相关,我会将其换成一些微不足道的东西).
界面看起来像这样:
public interface IMyService
{
CarModel GetCar(string registration);
CarModel AddCar(Car car);
PersonModel GetPerson(string personId);
PersonModel AddPerson(Person person);
}
Run Code Online (Sandbox Code Playgroud)
现在,我的模型目前的工作方式如下:我有一个BaseResponseModel
,每个都SomethingModel
继承.每个SomethingModel
包含一些基本属性,也包含一个Something
- 像这样:
基础响应模型
public class BaseResponseModel
{
public List<string> Errors { get; set; }
public bool HasErrors
{
get
{
return (Errors != null && Errors.Count > 0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
具体的反应模型
public class CarModel : BaseResponseModel
{
public Car Car { get; set; }
}
public class PersonModel : BaseResponseModel
{
public …
Run Code Online (Sandbox Code Playgroud) 我们有一个内容管理的解决方案(SDL Tridion,具体而言;问题更为一般),其中包括多个具有不同语言内容的网站.它们共享许多基于Razor的模板,这些模板用于在发布页面时呈现具有特定注入内容的HTML片段.
CRM也通过CMS进行管理,同样的模板用于创建电子邮件新闻稿.这些HTML电子邮件包含图像,这些图像将发布到管理相关分发列表的任何站点.由于模板系统是通用的,并且CMS没有最终产品的绝对URL的概念,因此这些图像都嵌入了相对地址.我们有能力将绝对URL作为元数据应用于CMS中的不同网站,并编写.Net扩展以将这些URL格式化为渲染图像标记; 但是,这会给这项工作增加相当大的开销.
我们可以通过在电子邮件标记<base href="..." />
的<head>
部分中使用标记来解决此问题.这似乎在Outlook中起作用,至少; 但是,我无法找到有关电子邮件客户端执行和不支持此标记的最新信息.
那么问题是:电子邮件客户端(特别是基于浏览器的客户端)的支持程度如何<base>
?
我有位置列表
public class Location
{
public string LocationName { get; set; }
public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我为这个类创建了编辑器模板
<div>
<span>@Html.TextBoxFor(a => a.LocationName)</span>
<span style="color: red;">@Html.TextBoxFor(a => a.Address )</span>
</div>
Run Code Online (Sandbox Code Playgroud)
问题是,位置加载了ajax到我的页面,然后我将结果发送回服务器.但是如何使用特定索引获取此位置?我的意思是,对于第一个位置,它将生成如下:
<input type="text" name="Locations[0].LocationName" />
Run Code Online (Sandbox Code Playgroud)
对于第二个位置,当我按"添加位置"按钮时,它应该从服务器获取此位置(从控制器的操作作为html字符串)但索引1不是0,因为它是下一个位置.
有可能实现吗?或者我做错了什么?
我是ASP.Net的新手,我不确定我是否会以正确的方式解决这个问题.我有一个Repeater,它绑定到一个"图像"对象列表.在每个RepeaterItem内是一个复选框,我有一个按钮OnClick事件,我想显示已检查的Image对象的一些属性.
标签更新,但元数据为空.DataBinder.Eval(i.DataItem,"FileName")将返回null,但我不确定为什么?我想也许复选框的回发导致了问题,但是如果我尝试在发生任何回发之前显示数据,我仍然会遇到同样的问题,所以也许我没有正确地获取属性.或者我是以完全错误的方式解决这个问题?任何帮助赞赏.
码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string importPath = Server.MapPath("~/Images/ForImport");
ImageProcessor processor = new ImageProcessor(importPath);
rptImageList.DataSource = processor.ImageList;
rptImageList.DataBind();
}
}
protected void btnImport_Click(object sender, EventArgs e)
{
foreach (RepeaterItem i in rptImageList.Items)
{
CheckBox chk = i.FindControl("chkSelectImage") as CheckBox;
if (chk.Checked)
{
Testlabel.Text += "Selected: " + DataBinder.Eval(i.DataItem, "FileName");
}
}
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<asp:Repeater ID="rptImageList" runat="server">
<ItemTemplate>
<div class="photoinstance">
<asp:Image runat="server" ImageUrl='<%#"Images/ForImport/" +DataBinder.Eval(Container.DataItem, "FileName") %>' />
<asp:CheckBox ID="chkSelectImage" AutoPostBack="true" runat="server"/>
<p><%#Eval("FileName")%> - …
Run Code Online (Sandbox Code Playgroud) 假设我有一个具有整数Day
属性的类和一个IEnumerable<T>
对象,其中的天数分别为2,3,4,1,3,3和5(按此顺序).
有没有办法保证子序列的顺序(例如)o.Day == 3
从其元素在原始列表中的相对位置维护而不需要显式的自定义实现IEnumerable
?
c# ×8
asp.net ×3
asp.net-mvc ×2
.net ×1
ajax ×1
architecture ×1
arrays ×1
base ×1
checkbox ×1
dataitem ×1
email-client ×1
generics ×1
html ×1
html-email ×1
ienumerable ×1
jquery ×1
json ×1
owin ×1
repeater ×1
ruby ×1
sorting ×1
urlhelper ×1