[英]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.