我有一个情况,我正在上传用户从他的本地文件系统中选择的图像.在我看来,我的表单基本上有两个提交按钮.一个用于正常提交表单,并执行所有验证.第二个仅用于上传图像,在这种情况下我还不想验证.
我设法关闭客户端验证,给我的"上传图片"提交按钮一个类"取消样式名称",所以
<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" />
Run Code Online (Sandbox Code Playgroud)
现在,当我回发时,我的模型有一个属性UploadImageButton,当单击此按钮时,它会填充此属性(输入的名称与属性匹配).这样,我知道表单是由我的真实提交按钮还是由UploadImageButton提交的.
我的问题是这样的......如何关闭ServerSide验证?我不希望在用户单击此按钮时显示验证摘要信息.我知道您可以使用此方法添加自定义模型错误
ModelState.AddModelError("{key}", "{error msg}");
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来删除模型错误.这可能吗?
编辑:
这是我想出的:
foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
//ModelState.Remove(key); //This was my solution before
ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}
Run Code Online (Sandbox Code Playgroud) 我的项目中有一个枚举,我为这个枚举创建了一个自定义编辑器模板.所以,现在我对具有此枚举类型的属性的任何模型都将呈现下拉列表.
这很好用,但我想用我的下拉列表中的select元素命名属性的名称.这是我的编辑器模板的Razor代码.
@model ItemEnumerations.ItemType
<select id="PropertyNameHere" name="PropertyNameHere">
@foreach (ItemEnumerations.ItemType in Enum.GetValues(typeof(ItemEnumerations.ItemType))) {
<option value="@value" @(Model == @value ? "selected=\"selected\"" : "")>@value.ToString()</option>
}
</select>
Run Code Online (Sandbox Code Playgroud)
所以,在我对select元素id和name属性有'PropertyNameHere'的地方,我希望得到我的模型属性的名称.这是一个例子:
我的型号:
public class MyModel{
public int ItemID {get;set;}
public string ItemName {get;set;}
public ItemEnumerations.ItemType MyItemType {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我的观点代码:
@model MyModel
@Html.LabelFor(m => model.ItemID)
@Html.DisplayForm(m => model.ItemID)
@Html.LabelFor(m => model.ItemName)
@Html.EditorFor(m => model.ItemName)
@Html.LabelFor(m => model.MyItemType )
@Html.EditorFor(m => model.MyItemType )
Run Code Online (Sandbox Code Playgroud)
我希望我的select元素的名称和id为'MyItemType'.
我有两个站点,都在同一个域上,但具有不同的子域.
site1.mydomain.com site2.mydomain.com
一旦我对每个网站进行了身份验证,我会查看后续请求中包含的Cookie,并且每个网站的Cookie都相同.
但是,如果我登录到第一个站点,然后导航到另一个站点,我希望我的站点1的cookie与请求一起发送到site2,但事实并非如此.这是我的cookie的属性.
登录到Site1后,此cookie就存在
Name = MySite
Domain =
Has Keys = False
HttpOnly = False
Path = /
Value = 1C41854066B03D8CC5679EA92DE1EF427DAC65D1BA0E672899E27C57245C1F0B7E93AB01B5563363AB4815A8F4BDE9D293FD261E03F8E60B8497ABBA964D8D315CCE1C8DD220C7176E21DC361935CF6
Expires = 1/1/0001 12:00:00 AM
Run Code Online (Sandbox Code Playgroud)
登录到Site2后,这些cookie就存在了.
Name = MySite
Domain =
Has Keys = False
HttpOnly = False
Path = /
Value = C8C69F87F993166C4D044D33F21ED96463D5E4EB41E1D986BF508DA0CBD5C2CA7D782F59F3BC96871108997E899FF7401C0D8615705BDB353B56C7E164D2302EE6731F41705016105AD99F4E0578ECD2
Expires = 1/1/0001 12:00:00 AM
Run Code Online (Sandbox Code Playgroud)
我已经在每个域上设置了域(不会显示在请求cookie中,因为它只在客户端上需要).我确保我的每个表格设置都相同我确保我的机器密钥设置在两个网络配置中是相同的.
我不知道为什么这不起作用.什么是cookie包含客户端将它发送给一个子域而不是另一个子域,因为他们都使用相同的身份验证cookie到目前为止我可以告诉?
如果您想要查看更多信息,请发表评论.我已经在这两天苦苦挣扎了.根据这篇文章,这应该是有效的.
更新: 添加了代码
这是我的身份验证配置文件设置.这用于两个站点.
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
defaultUrl="~/Home/Index"
name="MySite"
protection="All"
path="/"
domain="mydomain.com"
enableCrossAppRedirects="true"
timeout="2880"
/>
Run Code Online (Sandbox Code Playgroud)
这是我在Site1中创建cookie的代码.
//Add a cookie that the Site2 …Run Code Online (Sandbox Code Playgroud) 我有一个MVC3站点,其模型不能与默认模型绑定一起使用.我一直在线查看代码示例,看来我可以创建一个自定义模型绑定器,它可以实现IModelBinder,也可以从DefaultModelBinder继承.有人可以解释每种方法的优点/缺点,也可以说明何时使用一种方法而不是另一种方法.
提前致谢.
有没有办法让睡眠线程中断?如果我有类似的代码.
while(true){
if(DateTime.Now.Subtract(_lastExecuteTime).TotalHours > 1){
DoWork();
_lastExecuteTime = DateTime.Now();
continue;
}
Thread.Sleep(10000) //Sleep 10 seconds
if(somethingIndicatingQuit){
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我想每小时执行一次DoWork().所以,我想睡10秒钟.每10分钟左右检查一次.但是,如果将我的睡眠设置为10分钟,并且我想要终止此后台任务,我必须等待睡眠恢复.
我的实际代码是使用Threading.ManualResetEvent来关闭后台工作,但我的问题是使用ThreadSleep代码.如有必要,我可以发布更多代码.
好的,我将在这里添加一些更完整的代码,因为我认为它将回答一些问题.
private readonly ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private readonly ManualResetEvent _pauseEvent = new ManualResetEvent(true);
private Thread _backGroundWorkerThread;
//This starts our work
public void Start() {
_backGroundWorkerThread = new Thread(ExecuteWorker) {IsBackground = true, Name = WorkerName + "_Thread"};
_shutdownEvent.Reset();
_backGroundWorkerThread.Start();
}
internal void Stop() {
//Signal the shutdown event
_shutdownEvent.Set();
//Make sure to resume any paused threads
_pauseEvent.Set();
//Wait …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个MVC3 Web应用程序,需要使用外部网用户登录并使用Forms身份验证进行身份验证.Intranet用户应使用Windows身份验证自动登录.
我发现这篇文章,
http://aspalliance.com/553_Mixed_Mode_Authentication.all
但是它的日期是2004年11月,并且喜欢找到比7年前更新的内容.
我的计划是在IIS中有两个应用程序,虚拟目录指向同一个物理目录,但是一个允许匿名访问而另一个不允许.
当用户在Windows/Intranet方面进行身份验证时,我希望简单地模拟通过表单身份验证登录的用户.这种方法有什么缺陷吗?有更好的想法吗?
编辑:2011年7月22日
我正在使用IIS7,它不允许我做旧文章中建议的许多事情.由于IIS7和ASP.NET网站之间的身份验证集成有点紧张,因此不允许使用某些内容.例如,我无法在单个文件上设置Windows Auth,而应用程序的其余部分使用Forms Auth.
我经常看到this在jquery 中使用关键字的示例.有时我看到它与$和括号一起使用,有时没有.而且我以为我看到它与每个都用了一点.
所以,
var id = this.attr('id');
var id = $(this).attr('id');
var id = $this.attr('id');
Run Code Online (Sandbox Code Playgroud)
这些都一样吗?有首选方式吗?是thisjavascript的东西和$(this)jQuery的东西?如果是这样,哪里$this下降?
我知道这可能是一个全新的问题,但我无法让简单的,this单独的,工作.我只能$(this)上班.我不确定我做错了什么,或者我是否一直在阅读错别字的例子.
我的模型属性是double类型.我的一个项目的值为0.000028,但是当我的编辑视图呈现时,该值的编辑器显示为2.8e-005.
除了这让我的用户感到困惑之外,它也失败了我的正则表达式验证
[Display(Name = "Neck Dimension")]
[RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Neck Dimension must be a Number")]
[Range(0, 9999.99, ErrorMessage = "Value must be between 0 - 9,999.99")]
[Required(ErrorMessage = "The Neck Dimension is required.")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")]
public double? NeckDimension { get; set; }
Run Code Online (Sandbox Code Playgroud)
如何显示此字段?我有一些代码(如下所示)会像我想的那样渲染一个小数,但我不知道在哪里实现它.
var dbltest = 0.000028D;
Console.WriteLine(String.Format("{0:F20}", dbltest).TrimEnd('0'));
Run Code Online (Sandbox Code Playgroud)
我在两个地方使用属性NeckDimension,并编辑视图和显示视图.以下是每个渲染的方式.
@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" })
@Html.DisplayFor(model => model.NeckHDimension)
Run Code Online (Sandbox Code Playgroud)
更新 显然,DisplayFormat不能与TextBoxFor一起使用.我试图将我的@ Html.TextBoxFor更改为Html.EditorFor并给它一个类,但它失败并出现以下异常.
The model item passed into the dictionary is of type 'System.Double', …Run Code Online (Sandbox Code Playgroud) 我正在根据微软的会员资料开发一些自定义的身份验证代码.在查看配置文件功能时,我查看了System.Web.dll v4.0.30319中的ProfileBase类.有一些类级变量被声明为一个类型但随后被初始化为一个转换为该类型的空值.
例如,
private static Exception s_InitializeException = (Exception) null;
private static ProfileBase s_SingletonInstance = (ProfileBase) null;
private static Hashtable s_PropertiesForCompilation = (Hashtable) null;
Run Code Online (Sandbox Code Playgroud)
我通常不会初始化具有类级别范围的变量.我想知道这是我应该做的事情还是它的目的.
感谢任何启示.
我已经创建了自定义编辑器模板和显示模板.我已将这些类型中的每一种放在我的views文件夹中的一个文件夹中.这些文件夹被命名为EditorTemplate或DisplayTemplate,具体取决于创建的模板类型.
所以,现在我可以使用EditorFor来使用我的自定义编辑器模板,或者使用DisplayFor作为我的自定义编辑器模板.
我想为LabelFor创建一个自定义模板,但我还没有找到这样的例子.我会在我的Views文件夹中创建一个名为Labeltemplate的文件夹并在此处添加吗?
UPDATE
我试图扩展LabelFor的原因是处理KeyValuePair类型的Property.我想使用此属性的Key作为Label,将值作为Display.我在这里问了一个关于DisplayFor来处理Value的问题.
我的解决方案最终成为>
@Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key)
Run Code Online (Sandbox Code Playgroud)
谢谢,
c# ×4
asp.net ×2
.net ×1
cookies ×1
javascript ×1
jquery ×1
modelstate ×1
razor ×1
validation ×1