有没有办法在将数据提交到远程方法之前以及从远程方法返回结果之后,在客户端上挂接MVC3不显眼的远程验证?
我试图告诉远程验证器仅在单击提交按钮时执行验证.正常行为是多次验证,例如在按键,模糊等过程中.这是不好的,因为有问题的验证方法需要调用非幂等操作.我需要确保只有在用户单击了提交按钮时才调用该方法.
如果我可以挂钩到before事件,我可以在表单中设置一个字段,将提交按钮标记为是否被点击.但是,在远程方法返回验证结果后,我需要重置此标志.
还有其他建议吗?这是用于使用ASP.NET成员资格提供程序的Membership.ValidateUser(string username, string password)方法验证密码.FailedPasswordAttemtCount每次发送无效密码时此方法都会递增,所以我不希望它在模糊,按键等期间执行.
asp.net-mvc jquery-validate unobtrusive-validation asp.net-mvc-3 remote-validation
我一直在努力弄清楚为什么没有触发ValidationController动作.
我在项目范围的web.config中启用了设置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Run Code Online (Sandbox Code Playgroud)
我有以下控制器:
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private readonly IUserRepository userRepository;
public ValidationController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
public JsonResult IsUserNameAvailable(string username)
{
User user = userRepository.Get(u => u.UserName == username);
if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
else return Json(false, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
和以下viewmodel:
[Required(ErrorMessage = "Required *")]
[StringLength(50, MinimumLength = 4, ErrorMessage = "Please keep the username between four and twenty …Run Code Online (Sandbox Code Playgroud) jquery-validate unobtrusive-validation remote-validation asp.net-mvc-4
这是我的型号代码
public class BlobAppModel
{
[Required(ErrorMessage="Please enter the name of the image")]
[Remote("IsNameAvailable","Home",ErrorMessage="Name Already Exists")]
public string Name { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我有
public JsonResult IsNameAvailable(string Name)
{
bool xx= BlobManager.IsNameAvailable(Name);
if (!xx)
{
return Json("The name already exists", JsonRequestBehavior.AllowGet);
}
return Json(true, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
在我的数据中我有
public static bool IsNameAvailable(string Name)
{
var test = "";
using (var x = new BlobTestAppDBEntities())
{
try
{
test=x.BlobApps.Where(m => m.Name == Name).FirstOrDefault().Uri;
if (test != null)
return false;
else
return true; …Run Code Online (Sandbox Code Playgroud) 我正在进行MVC3 unrobustive远程验证以检查用户名可用性.
它工作正常,但需要相当长的时间加载验证消息!有没有办法在过渡期间显示微调器/用户名可用的检查消息?
我正在尝试检查注册时是否存在电子邮件,以便数据库中没有重复的电子邮件.我使用MVC4默认Internet应用程序执行此操作,但我已向RegisterviewModel添加了电子邮件字段.我也注意到,使用UserName字段做得很好,但我不知道他们是如何做到的.我尝试按照下面的博客但没有运气,因为当我点击创建时没有回应.Tug Berk.当我使用Firebug我收到Status: 302 Found的时候Json action excutes
这就是我所拥有的:
用户资料
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
RegisterViewModel
public class RegisterModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email")]
[Remote("DoesUserEmailExist", "Account", HttpMethod = "POST", ErrorMessage = "Email address already exists. Please enter a different Email …Run Code Online (Sandbox Code Playgroud) c# email-validation remote-validation asp.net-mvc-4 asp.net-4.5
我有模特:
public class MyModel
...fields
[Remote(ActionName, ControllerName)]
public string SomeNumber { get; set; }
..fields
Run Code Online (Sandbox Code Playgroud)
并在ControllerName控制器中执行操作:
public JsonResult ActionName(string someNumber)
{...}
Run Code Online (Sandbox Code Playgroud)
但是当调用action时,参数someNumber总是为null.当我尝试调试它时,我得到了
GET /ControllerName/ActionName?MyModel.SomeNumber =34189736
Run Code Online (Sandbox Code Playgroud)
我怎样才能使它工作?(我无法传递整个模型MyModel,并且无法在我的视图中更改MyModel.SomeNumber字段的名称)
UPD.在我看来输入:
<input data-val="true" data-val-remote-additionalfields="*.SomeNumber" data-val-remote-url="/ControllerName/ActionName" id="MyModel_SomeNumber" name="MyModel.SomeNumber" type="text" value="34189734" class="valid">
Run Code Online (Sandbox Code Playgroud)
UPD解决了!:)我用单个字段SomeNumber创建新模型并使用前缀:
SomeNumber([Bind(Prefix = "MyModel")]MySingleFieldModel model)
Run Code Online (Sandbox Code Playgroud) 想象这种情况:
在默认的MVC3项目中,在中创建一个新的复杂类型 AccountModels.cs
public class GlobalAccount
{
public GlobalAccount()
{
this.LogOn = new LogOnModel();
this.Register = new RegisterModel();
}
public LogOnModel LogOn { get; set; }
public RegisterModel Register { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在RegisterModel更改UserName为:
[Required]
[Remote("UserNameExists", "Validation", "", ErrorMessage = "Username is already taken.")]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed.")]
[Display(Name = "Username (spaces will be stripped, must be at least 6 characters long)")]
public string UserName { get; set; }
Run Code Online (Sandbox Code Playgroud)
控制器中的 …
我使用了以下教程:http: //msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx
一切似乎都很好,但就我而言,字符串Username总是返回null.经过大量的研究,我发现每个人都发现了BIND前缀.在许多情况下,这将是伟大的,但不是这个.我应该注意所有属性和名称排列,但是在我的for循环中,EditorFor创建了一个[i] .Username字段,这不会映射到任何模型属性.
问题:我想我想将[i] .Username映射到Username,其中i是0-infinity中的任何数字,所以当它GETS时,该值会正确地传递给Action.我该怎么做呢?如果这是错误的,我该怎么做才能对表格中的特定行进行验证?
@for (var i = 0; i < Model.Count; i++)
{
BLAH BLAH BLAH CODE FOR BUILDING TABLE ROWS
<td>
@Html.EditorFor(modelItem => Model[i].Username)
</td>
}Run Code Online (Sandbox Code Playgroud)
因为如果不是成千上万的记录,我在技术上可以拥有HUNDREDS,我宁愿没有一个绑定PREFIX的所有1000.我从根本上错过了一些东西吗?我是ASP.NET MVC的新手,习惯了WebForms,所以我觉得有时候我会混合概念并混合一些完全错误的东西.
编辑: 我通过执行以下操作修复它,但不确定这是否是最好的主意.我将参数设置为没有[i]前缀的FieldName,但仍然检索带有[i]前缀的元素.Javascript不是我的Forte所以如果它太可怕请告诉我.
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = fieldName.substr(fieldName.lastIndexOf(".") + 1);
var actualFieldName = appendModelPrefix(fieldName, prefix)
value.data[paramName] = …Run Code Online (Sandbox Code Playgroud) 出于某种原因,每当我尝试远程验证模型中数组内的基本属性时,属性的值不会作为参数传递.
例如,当调用我的远程验证方法(UniqueItemNo)时,字符串参数"id"始终为null.如果我要在CartNumber而不是ItemNumber上执行验证,则正确传递参数.
public class HomeController : Controller
{
public ActionResult Index()
{
CartModel cart = new CartModel();
cart.Items.Add(new ItemModel() { ItemNumber = "12345" });
return View(cart);
}
[HttpPost]
public JsonResult UniqueItemNo(string id)
{
/** Do Work **/
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
public class ItemModel
{
[Remote("UniqueItemNo", "Home", HttpMethod="POST")]
public string ItemNumber { get; set; }
}
public class CartModel
{
public CartModel()
{
Items = new List<ItemModel>();
}
public List<ItemModel> Items { get; set; }
public string CartNumber …Run Code Online (Sandbox Code Playgroud) 在客户端,我做
$.ajax({
url: '/emplacements/keyexist',
type: "POST",
data: JSON.stringify(postData),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
Run Code Online (Sandbox Code Playgroud)
但是操作方法中的值始终为“null”
[AcceptVerbs("GET", "POST")]
public IActionResult KeyExist(
string nom, //[Bind(Prefix = nameof(EmplacementDTO.Nom))],
int id //[Bind(Prefix = nameof(EmplacementDTO.Id))]
)
{
// nom == null
// id == 0
Run Code Online (Sandbox Code Playgroud)
我在我的模型中使用远程属性来检查重复的页面标题如下
public class Page
{
[Remote("CheckDuplicate", "Page", ErrorMessage = "Title already taken")]
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我将根据" 检查 "结果返回JsonResult数据,如下所示:
public JsonResult CheckDuplicate(string Title)
{
var result = db.Pages.Where(a => a.Title == Title).Count() == 0;
return Json(result, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
这在Create动作中工作正常,但问题是,它限制了我编辑现有页面,因为它正在检查相同的查询.
如何解决这个问题呢?请建议我
asp.net-mvc ×5
c# ×5
jquery ×2
validation ×2
.net-5 ×1
action ×1
asp.net ×1
asp.net-4.5 ×1
controller ×1
list ×1
loading ×1
model ×1
telerik-grid ×1