[英]Completing the modelstate after autocompletion
所以这是我遇到的问题。
最初,我是用一个首先要成为朋友的用户选择列表填充收件人字段的。
这对我来说似乎不够用户友好。 因此,我开始使用jQuery进行自动完成。 自动完成功能就像一种魅力。
我遇到的问题是当我发送消息时,我的modelstate
作为消息无效。 收件人仅填写用户名。
我应该摆脱验证并手动填写所有这些字段吗? 或者我可以对此问题做些更明智的选择吗?
<div class="label">@Html.LabelFor(model => model.Receiver.UserName)</div>
<div class="fullinput">@Html.TextBoxFor(model => model.Receiver.UserName)</div><br />
<div class="label">@Html.LabelFor(model => model.Subject)</div>
<div class="fullinput">@Html.TextBoxFor(model => model.Subject)</div><br />
<div class="label">@Html.LabelFor(model => model.Content)</div>
<div class="fullinput">@Html.TextAreaFor(model => model.Content)</div><br />
那就是我正在使用的html。
$("#Receiver_UserName").autocomplete({
source: function (request, response) {
$.ajax({
url: "/Function/FindUsers", // Or your controller
dataType: "json",
data: { usr: request.term },
success: function (data) {
// Returned data follows the Spellword model
response($.map(data, function (item) {
return {
id: item.Id,
label: item.UserName,
value: item.UserName
}
}))
}
});
},
这是自动完成呼叫:
[HttpPost]
public ActionResult Send(Message message)
{
User user = entities.Users.SingleOrDefault(u => u.UserName.Equals(User.Identity.Name));
//ViewData["Friends"] = new SelectList(user.Friends, "Id", "Name");
if (ModelState.IsValid)
{
entities.Messages.Add(message);
entities.SaveChanges();
return RedirectToAction("Index");
}
return View(message);
}
我在那儿检查验证,它总是无效的,这很有意义。
public class Message
{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "Subject is required")]
[Display(Name = "Subject")]
public string Subject { get; set; }
[Required(ErrorMessage = "Message is required")]
[Display(Name = "Message")]
public string Content { get; set; }
[Required]
[Display(Name = "Date")]
public DateTime Created { get; set; }
public Boolean Read { get; set; }
[Required(ErrorMessage = "Can't create a message without a user")]
public int SenderId { get; set; }
public virtual User Sender { get; set; }
[Required(ErrorMessage = "Please pick a recipient")]
public int ReceiverId { get; set; }
public virtual User Receiver { get; set; }
}
最后是消息模型。 显然我没有所有这些字段,所以这就是为什么modelstate对我哭泣。
我想知道在这种情况下我是否可以跳过对modelstate的检查,或者是否应该以更好的方式解决此问题。
你为什么不尝试这样的事情:
$("#Receiver_UserName").autocomplete({
source: function (request, response) {
$.ajax({
url: "/Function/FindUsers", // Or your controller
dataType: "json",
data: { usr: request.term },
success: function (data) {
// Returned data follows the Spellword model
response($.map(data, function (item) {
return {
id: item.Id,
label: item.UserName,
value: item.Email //Don't pass the name as value
}
}))
}
});
},
我的意思是...您将用户名用作表单的标签,但是将电子邮件作为您在发送电子邮件时真正要使用的值来传递。
我解决了这样的问题
[HttpPost]
public ActionResult Send(Message message)
{
User user = entities.Users.SingleOrDefault(u => u.UserName.Equals(User.Identity.Name));
User recipient = entities.Users.SingleOrDefault(u => u.UserName.Equals(message.Receiver.UserName));
ModelState.Clear();
if (recipient != null && user != null)
{
message.Sender = user;
message.SenderId = user.Id;
message.Receiver = recipient;
message.ReceiverId = recipient.Id;
message.Created = DateTime.Now;
entities.Messages.Add(message);
entities.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(message);
}
}
但是我对解决方案不太满意,因为它绕开了我的整个验证过程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.