所以这就是我遇到的问题。
最初,我填写了收件人字段,其中列出了一个首先会有用户选择的用户。
这对我来说似乎不够用户友好。所以,我开始使用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; }
}
最后是消息模型。 显然我没有所有这些领域,所以这就是为什么模型状态在哭我。
我想知道我是否可以在这种情况下跳过检查模型状态,或者我是否应该以更好的方式解决这个问题。
答案 0 :(得分:1)
$("#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
}
}))
}
});
},
我的意思是......您使用用户名作为表单的标签,但是在发送电子邮件时将电子邮件作为您真正想要使用的值传递。
答案 1 :(得分:0)
我解决了这个问题
[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);
}
}
但我对解决方案不满意,因为它绕过了我的整个验证过程